Где хранить глобальный стейт приложения, написанного на Винформах?

При разработке приложений на Windows Forms с использованием C# важно уметь хранить и управлять глобальным состоянием приложения. Глобальный стейт, также известный как глобальные переменные или данные приложения, обычно используется для хранения информации, которая должна быть доступна из всех форм или компонентов приложения.

Есть несколько способов хранения глобального стейта в приложениях на Windows Forms:

1. Использование статических полей или свойств: Вы можете создать статические поля или свойства в основном классе приложения или в отдельном классе, который будет служить хранилищем глобального стейта. Например:

public static class GlobalState
{
    public static string UserName { get; set; }
    public static int Age { get; set; }
}

Вы можете использовать эти свойства из любой формы или компонента следующим образом:

string userName = GlobalState.UserName;
int age = GlobalState.Age;

2. Использование контекста приложения: Windows Forms предоставляет класс ApplicationContext, который может использоваться для создания контекста приложения. В контексте приложения вы можете определить свои собственные свойства для хранения глобального стейта. Например:

public class MyApplicationContext : ApplicationContext
{
    public string UserName { get; set; }
    public int Age { get; set; }
}

Затем, создайте экземпляр класса MyApplicationContext и установите его в качестве контекста приложения:

MyApplicationContext context = new MyApplicationContext();
context.UserName = "John";
context.Age = 30;

Application.Run(context);

Теперь вы можете получить доступ к глобальному стейту из любой формы или компонента, используя контекст приложения:

MyApplicationContext context = (MyApplicationContext)Application.OpenForms[0].ApplicationContext;
string userName = context.UserName;
int age = context.Age;

3. Использование Singleton-класса: Создание класса в стиле Singleton также является популярным способом хранить глобальный стейт. В этом случае, у класса будет только один экземпляр, который будет доступен из любой части приложения. Например:

public class AppState
{
    private static AppState instance;
    
    public string UserName { get; set; }
    public int Age { get; set; }

    private AppState()
    {
    }

    public static AppState Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new AppState();
            }
            
            return instance;
        }
    }
}

Вы можете получить доступ к экземпляру AppState из любой формы или компонента следующим образом:

AppState appState = AppState.Instance;
string userName = appState.UserName;
int age = appState.Age;

В заключение, хранение глобального стейта в приложении на Windows Forms может быть достигнуто с использованием статических полей или свойств, контекста приложения или Singleton-класса. Каждый из этих подходов имеет свои преимущества и недостатки, поэтому рекомендуется выбирать тот, который наиболее соответствует специфическим требованиям вашего приложения.