С# отдельный класс для хранения

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

public static class Storage
    {
        public static string filePath { get; set; }
    }

Или есть другие способы сделать это?


person Athiwat Chunlakhan    schedule 14.08.2009    source источник
comment
Вы хотите сказать, что вам нужна глобальная переменная, через которую вы можете получить доступ к объектам и методам? Если это так, вы можете исследовать использование Singleton.   -  person Charlie Salts    schedule 14.08.2009


Ответы (5)


Если вам действительно нужно сделать ваш пример одноэлементным, вот как это сделать.

public class StorageSingleton
{
    private static readonly StorageSingleton instance;

    static StorageSingleton() { 
         instance = new Singleton();
    }
    // Mark constructor as private as no one can create it but itself.
    private StorageSingleton() 
    { 
        // For constructing
    }

    // The only way to access the created instance.
    public static StorageSingleton Instance
    {
        get 
        {
            return instance;
        }
    }        

    // Note that this will be null when the instance if not set to
    // something in the constructor.
    public string FilePath { get; set; }
}

Способ вызова и установки синглтона следующий:

// Is this is the first time you call "Instance" then it will create itself
var storage = StorageSingleton.Instance;

if (storage.FilePath == null)
{
    storage.FilePath = "myfile.txt";
}

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

// Mark constructor as private as no one can create it but itself.
private StorageSingleton() 
{ 
    FilePath = string.Empty; 
}

Слово предупреждения; создание чего-либо глобального или одноэлементного в конечном итоге сломает ваш код. Позже вам действительно стоит проверить шаблон репозитория.

person Spoike    schedule 14.08.2009

Вы можете рассмотреть возможность использования шаблона проектирования Singleton: Реализация Singleton в c#

eg.

using System;
public class Singleton
{
   private static Singleton instance;
   private Singleton() {}
   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}
person Sam Warwick    schedule 14.08.2009

Вы должны взглянуть на шаблон репозитория:

http://martinfowler.com/eaaCatalog/repository.html

Одним из способов реализации этого шаблона является использование ORM s.a. NHibernate:

https://web.archive.org/web/20110503184234/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/10/08/the-repository-pattern.aspx

person Manu    schedule 14.08.2009
comment
Спасибо, быстро, сейчас разбираюсь. - person Athiwat Chunlakhan; 14.08.2009
comment
Но для вашего примера я думаю, что это слишком много для меня. Мне такой склад вообще не нужен. - person Athiwat Chunlakhan; 14.08.2009

Применение Singleton к исходному классу:

public class Storage
{
   private static Storage instance;
   private Storage() {}
   public static Storage Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Storage();
         }
         return instance;
      }
   }
   public string FilePath { get; set; }
}

использование:

string filePath = Storage.Instance.FilePath;
person German Latorre    schedule 14.08.2009

Мне нравится видеть эту реализацию синглтона в C#.

public class Singleton
{
    public static readonly Singleton instance;

    static Singleton()
    {
        instance = new Singleton();
    }

    private Singleton()
    {
       //constructor...
    }
}

C# гарантирует, что ваш экземпляр не будет переопределен, а ваш статический конструктор гарантирует, что у вас БУДЕТ создан экземпляр статического свойства до его первого использования.

Бонус: он потокобезопасен в соответствии с дизайном языка для статических конструкторов, без блокировки с двойной проверкой :).

person Spence    schedule 14.08.2009