Оголосіть словник у статичному класі


90

Як оголосити статичний об'єкт словника всередині статичного класу? я намагався

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

Але компілятор скаржиться, що " поле const посилального типу, відмінного від рядка, може бути ініціалізоване лише нулем ".


1
Не можна використовувати const з типом Словник, лише зі скалярними значеннями. (перевірте мою відповідь) msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx
Йона

Відповіді:


214

Якщо ви хочете оголосити словник один раз і ніколи не змінювати його, оголосіть його лише для читання:

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

Якщо ви хочете, щоб елементи словника читалися лише для читання (не лише посилання, але й елементів у колекції), вам доведеться створити клас словника лише для читання, який реалізує IDictionary.

Перевірте ReadOnlyCollection для довідки.

BTW const може використовуватися лише при оголошенні скалярних значень в рядку.


Як щодо того, щоб приватна статична змінна на рівні класу приватна статична словник <рядок, рядок> Коди помилок, а потім у відповідній функції перевірити, чи (ErrorCodes == null) {заповнити словник} значення кешу при використанні в циклі?
LifeOfPi

1
Якщо ви не хочете, щоб словник змінювався, ви можете обернути його в ReadOnlyDictionary. Більш ефективним (але менш безпечним варіантом) є присвоєння його IReadOnlyDictionaryтипу.
Рамон де Кляйн,

8

Правильним синтаксисом (як перевірено у 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

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

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

Edit: коментар Per Кріса нижче, з використанням Dictionary<string, string>більш , StringDictionaryяк правило , краще , але буде залежати від вашої ситуації. Якщо ви маєте справу зі старою базою коду, ви можете обмежитися StringDictionary. Також зверніть увагу, що наведено наступний рядок:

myDict["foo"]

поверне null, якщо myDictє a StringDictionary, але у випадку Dictionary<string, string>. Дивіться публікацію SO, яку він згадав, щоб отримати додаткову інформацію, яка є джерелом цього редагування.



Це саме те питання, з яким я пов’язав.
Chris Morgan

1
Ха-вау, навіть не вловив цього - просто випадково знайшов того самого. Я не зміг відредагувати коментар, тому просто відредагував допис, щоб підсумувати його в одному місці. Дякую!
areyling

1

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

Я вважаю, це також могло б спрацювати:

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

Крім того, як зазначає Y Low, додавання readonly- це також гарна ідея, і жоден з описаних тут модифікаторів не завадить модифікувати сам словник.


1

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

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
запит чи запит?
Еш,

0

Зробіть Словник статичним, і ніколи не додавайте до нього поза ctor вашого статичного об’єкта. Це здається простішим рішенням, ніж перебирання правил статики / const у C #.


0

Добре - отже, я працюю в ASP 2.x (не мій вибір ... але привіт, хто сука?).

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

... що підштовхнуло мене до того, що не можна використовувати ініціалізацію колекцій в ASP 2.x.


-1

Ви можете використовувати конструктор 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"} };
    }
}

1
Ви хотіли зробити словник статичним? Ви не можете мати його const. Як повідомляється в повідомленні про помилку, const можуть бути лише типи значень, рядки або null
Orion Edwards

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

Можливо ініціалізація в конструкторі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.