2009-08-14 3 views
1

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

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

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

+0

Что вы думаете хранить? –

+3

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

+0

@Charlie Salts Спасибо –

ответ

3

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

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; 
} 

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

+0

Спасибо, очень подробный пример. –

1

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

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

+0

Спасибо, что было быстро, я смотрю сейчас. –

+0

Но для вашего примера я думаю, что это слишком много для меня. Мне вообще не нужно такое хранилище. –

3

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

например.

using System; 
public class Singleton 
{ 
    private static Singleton instance; 
    private Singleton() {} 
    public static Singleton Instance 
    { 
     get 
     { 
     if (instance == null) 
     { 
      instance = new Singleton(); 
     } 
     return instance; 
     } 
    } 
} 
0

Применение 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; 
0

Я люблю видеть, что реализация одноэлементных в C#.

public class Singleton 
{ 
    public static readonly Singleton instance; 

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

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

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

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

Смежные вопросы