Объявите словарь внутри статического класса - PullRequest
85 голосов
/ 24 ноября 2008

Как объявить объект статического словаря внутри статического класса? Я пытался

public static class ErrorCode
{
    public const IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>()
    {
        { "1", "User name or password problem" }     
    };
}

Но компилятор жалуется, что " Поле const ссылочного типа, отличного от строки, может быть инициализировано только нулем ".

Ответы [ 9 ]

202 голосов
/ 24 ноября 2008

Если вы хотите объявить словарь один раз и никогда не изменять его, то объявите его только для чтения:

private static readonly Dictionary<string, string> ErrorCodes
    = new Dictionary<string, string>
{
    { "1", "Error One" },
    { "2", "Error Two" }
};

Если вы хотите, чтобы элементы словаря были доступны только для чтения (не только ссылки, но и элементы в коллекции), вам придется создать класс словаря только для чтения, который реализует IDictionary.

Проверьте ReadOnlyCollection для справки.

BTW const можно использовать только при объявлении скалярных значений в строке.

8 голосов
/ 24 ноября 2008

Правильный синтаксис (как проверено в 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"} };
    }
}
4 голосов
/ 29 марта 2011

Старый вопрос, но я нашел это полезным. Оказывается, есть также специальный класс для словаря, использующий строку как для ключа, так и для значения:

private static readonly StringDictionary SegmentSyntaxErrorCodes = new StringDictionary
{
    { "1", "Unrecognized segment ID" },
    { "2", "Unexpected segment" }
};

Редактировать: В соответствии с комментарием Криса ниже, использование Dictionary<string, string> над StringDictionary обычно предпочтительнее, но зависит от вашей ситуации Если вы имеете дело со старой кодовой базой, вы можете ограничиться StringDictionary. Также обратите внимание, что следующая строка:

myDict["foo"]

вернет ноль, если myDict является StringDictionary, но в случае Dictionary<string, string> будет выдано исключение. См. SO сообщение, которое он упомянул для получения дополнительной информации, которая является источником этого редактирования.

1 голос
/ 18 апреля 2013

Создание статического конструктора для добавления значений в словарь

enum Commands
{
    StudentDetail
}
public static class Quires
{
    public static Dictionary<Commands, String> quire
        = new Dictionary<Commands, String>();
    static Quires()
    {
        quire.add(Commands.StudentDetail,@"SELECT * FROM student_b");
    }
}
1 голос
/ 24 ноября 2008

Проблема с вашим первоначальным примером была в основном связана с использованием const вместо static; Вы не можете создать ненулевую константную ссылку в C #.

Полагаю, это также сработало бы:

public static class ErrorCode
{
    public static IDictionary<string, string> ErrorCodeDic
        = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
}

Также, как указывает Y Low, добавление readonly также является хорошей идеей, и ни один из рассмотренных здесь модификаторов не помешает изменению самого словаря.

0 голосов
/ 25 мая 2010

ОК - так что я работаю в ASP 2.x (не мой выбор ... но кто ссорится?).

Ни один из примеров словаря инициализации не будет работать. Потом я наткнулся на это: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx

... что подтолкнуло меня к тому, что нельзя использовать инициализацию коллекций в ASP 2.x.

0 голосов
/ 24 ноября 2008

Сделайте словарь статическим и никогда не добавляйте его вне ctor вашего статического объекта. Это кажется более простым решением, чем возиться с правилами static / const в C #.

0 голосов
/ 24 ноября 2008

Вы можете использовать конструктор static / class для инициализации вашего словаря:

public static class ErrorCode
{
    public const IDictionary<string, string> ErrorCodeDic;
    public static ErrorCode()
    {
        ErrorCodeDic = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
    }
}
0 голосов
/ 24 ноября 2008
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"} };             
    }
}

Возможно инициализация в конструкторе.

...