Ссылка на экземпляр объекта в статическом классе (c #) - PullRequest
2 голосов
/ 06 января 2010

Мне интересно, возможно ли иметь статический класс для создания экземпляра другого класса с целью хранения ссылки на него глобально. У меня есть хранилище данных, которое состоит из объекта в памяти и хотел бы получить к нему доступ из разных мест. Данные должны сохранять изменения в приложении, поэтому их необходимо создавать вне пределов окна или области пользовательского интерфейса.

Я надеялся, что использование статического класса для этого будет правильным способом сделать это. Это что такое синглтон? Возможно ли то, что я ищу?

Ответы [ 3 ]

9 голосов
/ 06 января 2010

Обычный способ справиться с этим - использовать Singleton Pattern . Это в основном создает один экземпляр нестатического класса, к которому можно получить доступ статически (обычно с помощью свойства ClassName.Instance).

Вот отличная страница по созданию синглтона в C # .

1 голос
/ 06 января 2010

Статический класс может создавать и ссылаться на любой объект, как и любой другой класс. Это не совсем синглтон, но вы получите аналогичный конечный результат. Статический класс «создается» при первом обращении к нему, поэтому, если вам нужно, чтобы что-то произошло до того, как произойдет окно или что-то в UI, вам все равно нужно позаботиться об этом.

Является ли настоящий синглтон лучше, я не знаю. Есть немало людей, которые говорят, что синглтоны и статические классы плохие, в основном потому, что они делают код немного более жестким. В некотором смысле это почти глобальная переменная.

1 голос
/ 06 января 2010

Вот простой пример .... вы можете получить свойство, просто используя Config.Instance.Value

public class Config
{
    private Config() 
    {
        this.Value = "foobarr";
    }
    private static object _syncLock = new object();
    private static Config _instance;
    public static Config Instance
    {
        get
        {
            lock (_syncLock)
            {
                if (_instance == null)
                    _instance = new Config();
                return _instance;
            }
        }
    }

    public string Value { get; private set; }
}
...