2013-10-09 4 views
2

у меня есть класс, который выглядит примерно так:Singleton с открытыми свойствами

public class Constants 
{ 
    private static readonly Lazy<Constants> lazy = 
     new Lazy<Constants>(() => new Constants()); 

    public static Constants Instance { get { return lazy.Value; } } 
    Dictionary<string, List<string>> validApplicationTypes; 
    public Dictionary<string, List<string>> ValidApplicationTypes 
    { 
     get { return validApplicationTypes; } 

    } 
    private Constants() 
    { 
     // validApplicationTypes is populated from a DB table 
    } 
} 

Теперь за пределами получить доступ действительных типов приложений, как это:

Constants.Instance.ValidApplicationTypes 

Что бы быть лучшим способом, чтобы добавить куча строковых констант для этого класса? я должен добавить их как:

private static readonly string message= "SomeMessage"; 
public static string Message 
     { 
      get { return message; } 
     } 

и доступ к ним как: Constants.Message

или я должен добавить их так:

private string message= "SomeMessage"; 
    public string Message 
      { 
       get { return message; } 
      } 

и доступ к ним как: Constants.Instance.Message

Есть любая разница между этими двумя способами создания их внутри синглтона и доступа к ним извне?

+0

Просто потому, что 'static' не делает его константа. Могут ли они быть 'const' или' static readonly'? – Yuck

+0

Вы правы, я скучал по readonly. Исправлено: – DVM

+0

Используйте 'const' или' static readonly', я не вижу причин, чтобы сделать их членами экземпляра. –

ответ

1

Is there any difference between these 2 ways of creating them inside the singleton and accessing them from the outside?

Да.

Бывший реализация будет создан до любого экземпляра Constants и будет доступна так:

Constants.Message 

Последние никогда не будет создан до Instance инициализации и будет доступна, как это:

Constants.Instance.Message 

Добавление readonly к полю не повлияет на доступ к нему извне, но оно будет от t он внутри. Он будет доступен только при инициализации или в конструкторе класса, принадлежащего.

private static readonly string message= "SomeMessage"; 

или

private Constants() 
{ 
    message = "SomeMessage"; 
} 

Это не будет компилироваться, если readonly применяется:

private void SetMessage() 
{ 
    message = "SomeMessage"; 
} 

Ошибка:

A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)

+0

спасибо, получил это сейчас. Есть ли какое-либо преимущество в использовании одного из способов доступа к постоянным строкам? – DVM

+1

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

+1

Первый метод позволяет получить доступ к константам без необходимости создания экземпляра класса. Это связано с тем, что во-вторых, они не являются константами как таковыми, просто нормальными полями/свойствами в классе, которые всегда устанавливаются одним строковым литералом. –

0

Хм, почему бы не

public const string Message = "SomeMessage"; 

?

+0

По двум причинам: я исхожу из фона Java, а 'public static readonly' выглядел очень похоже на' public static final'. И второй ответ: http://stackoverflow.com/questions/755685/c-static-readonly-vs-const – DVM

+1

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. –

+1

@briandfoy, вопрос: «Какой был бы лучший способ добавить кучу строковых констант в этот класс?», И мой ответ дает лучший способ (на мой взгляд, конечно). –

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