Если Вы хотите объявить словарь, как только и никогда не изменять его тогда объявляют его как только для чтения:
private static readonly Dictionary<string, string> ErrorCodes
= new Dictionary<string, string>
{
{ "1", "Error One" },
{ "2", "Error Two" }
};
, Если Вы хотите к объектам словаря быть только для чтения (не только ссылка, но также и объекты в наборе) тогда, необходимо будет создать класс словаря только для чтения, который реализует IDictionary.
Выезд ReadOnlyCollection для ссылки.
константа BTW может только использоваться при объявлении встроенных скалярных величин.
Правильный синтаксис (как протестировано в VS 2008 SP1), это:
public static class ErrorCode
{
public static IDictionary<string, string> ErrorCodeDic;
static ErrorCode()
{
ErrorCodeDic = new Dictionary<string, string>()
{ {"1", "User name or password problem"} };
}
}
Проблема с Вашим начальным примером происходила, прежде всего, из-за использования const
, а не static
; Вы не можете создать непустую ссылку константы в C#.
я полагаю, что это также работало бы:
public static class ErrorCode
{
public static IDictionary<string, string> ErrorCodeDic
= new Dictionary<string, string>()
{ {"1", "User name or password problem"} };
}
кроме того, как Y Нижние точки, добавляя readonly
хорошая идея также, и ни один из модификаторов, обсужденных здесь, не предотвратит сам словарь от того, чтобы быть измененным.
Сделайте Словарь помехами, и никогда не добавляйте к нему за пределами ctor своего статического объекта. Это, кажется, простое решение, чем игра со статическими правилами / правилами константы в C#.
Можно использовать статическое / конструктора класса для инициализации словаря:
public static class ErrorCode
{
public const IDictionary<string, string> ErrorCodeDic;
public static ErrorCode()
{
ErrorCodeDic = new Dictionary<string, string>()
{ {"1", "User name or password problem"} };
}
}
public static class ErrorCode
{
public const IDictionary<string , string > m_ErrorCodeDic;
public static ErrorCode()
{
m_ErrorCodeDic = new Dictionary<string, string>()
{ {"1","User name or password problem"} };
}
}
, Вероятно, инициализируют в конструкторе.
ОК - так что я работаю в ASP 2.x (не мой выбор ... но эй, кто скулит?).
Ни один из примеров инициализации словаря не работает. Потом я наткнулся на это: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing- dictionaries-and-collections.aspx
... что подтолкнуло меня к тому факту, что можно ' t использовать инициализацию коллекций в ASP 2.x.