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 ".


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.


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

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.



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.


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

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

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 #.



-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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.