Deklarasikan Dictionary di dalam kelas statis

90

Bagaimana cara mendeklarasikan objek kamus statis di dalam kelas statis? Saya mencoba

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

Tetapi compiler mengeluh bahwa " Sebuah field const dari tipe referensi selain string hanya dapat diinisialisasi dengan null ".

Graviton
sumber
1
Anda tidak dapat menggunakan const dengan tipe Kamus, hanya dengan nilai skalar. (periksa jawaban saya) msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx
Yona

Jawaban:

214

Jika Anda ingin mendeklarasikan kamus satu kali dan tidak pernah mengubahnya, deklarasikan sebagai hanya baca:

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

Jika Anda ingin item kamus menjadi hanya-baca (bukan hanya referensi tetapi juga item dalam koleksi) maka Anda harus membuat kelas kamus hanya-baca yang mengimplementasikan IDictionary.

Lihat ReadOnlyCollection untuk referensi.

Konstanta BTW hanya dapat digunakan saat mendeklarasikan nilai skalar sebaris.

Yona
sumber
Bagaimana dengan memiliki variabel statis privat private static Dictionary <string, string> ErrorCodes tingkat kelas dan kemudian di fungsi masing-masing periksa apakah (ErrorCodes == null) {isi kamus} ke nilai cache saat digunakan dalam loop?
LifeOfPi
1
Jika Anda tidak ingin kamus diubah, Anda dapat membungkusnya menjadi ReadOnlyDictionary. Opsi yang lebih efisien (tetapi kurang aman) adalah menetapkannya ke suatu IReadOnlyDictionarytipe.
Ramon de Klein
8

Sintaks yang benar (seperti yang diuji di VS 2008 SP1), adalah ini:

public static class ErrorCode
{
    public static IDictionary<string, string> ErrorCodeDic;
     static ErrorCode()
    {
        ErrorCodeDic = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
    }
}
Graviton
sumber
Tapi ini tidak mencegah kelas yang mengkonsumsi untuk mengubah konten.
Everts
4

Pertanyaan lama, tapi menurut saya ini berguna. Ternyata, ada juga kelas khusus untuk Kamus yang menggunakan string untuk kunci dan nilainya:

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

Sunting: Sesuai komentar Chris di bawah ini, menggunakan Dictionary<string, string>lebih pada StringDictionaryumumnya lebih disukai tetapi akan tergantung pada situasi Anda. Jika Anda berurusan dengan basis kode yang lebih lama, Anda mungkin terbatas pada StringDictionary. Juga, perhatikan bahwa baris berikut:

myDict["foo"]

akan mengembalikan null jika myDictadalah a StringDictionary, tetapi pengecualian akan dilemparkan jika Dictionary<string, string>. Lihat posting SO yang dia sebutkan untuk informasi lebih lanjut, yang merupakan sumber edit ini.

Areyling
sumber
Itulah pertanyaan yang saya tautkan.
Chris Morgan
1
Ha wow, bahkan tidak mengerti - kebetulan menemukan yang sama. Saya tidak bisa mengedit komentar, jadi saya hanya mengedit posting untuk meringkas di satu tempat. Terima kasih!
areyling
1

Masalah dengan contoh awal Anda terutama disebabkan oleh penggunaan constdaripada static; Anda tidak dapat membuat referensi const non-null di C #.

Saya yakin ini juga akan berhasil:

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

Juga, seperti yang ditunjukkan oleh Y Low, menambahkan readonlyadalah ide yang bagus juga, dan tidak ada pengubah yang dibahas di sini yang akan mencegah kamus itu sendiri untuk dimodifikasi.

Charlie
sumber
1

Buat konstruktor statis untuk menambahkan nilai dalam Kamus

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");
    }
}
Sujith Radhakrishnan
sumber
1
quire atau query?
Abu
0

Anda dapat menggunakan konstruktor statis / kelas untuk menginisialisasi kamus Anda:

public static class ErrorCode
{
    public const IDictionary<string, string> ErrorCodeDic;
    public static ErrorCode()
    {
        ErrorCodeDic = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
    }
}
Andy
sumber
1
Apakah Anda bermaksud membuat kamus menjadi statis? Anda tidak dapat memilikinya const. Seperti pesan kesalahan mengatakan, hanya tipe nilai, string, atau null yang dapat menjadi const
Orion Edwards
0

Jadikan Dictionary statis, dan jangan pernah menambahkannya di luar ctor objek statis Anda. Itu tampaknya menjadi solusi yang lebih sederhana daripada mengutak-atik aturan statis / const di C #.

Jeff Hubbard
sumber
-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"} };             
    }
}

Mungkin menginisialisasi di konstruktor.

Craig
sumber