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 ".
c#
.net
dictionary
Graviton
sumber
sumber
Jawaban:
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.
sumber
ReadOnlyDictionary
. Opsi yang lebih efisien (tetapi kurang aman) adalah menetapkannya ke suatuIReadOnlyDictionary
tipe.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"} }; } }
sumber
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 padaStringDictionary
umumnya lebih disukai tetapi akan tergantung pada situasi Anda. Jika Anda berurusan dengan basis kode yang lebih lama, Anda mungkin terbatas padaStringDictionary
. Juga, perhatikan bahwa baris berikut:myDict["foo"]
akan mengembalikan null jika
myDict
adalah aStringDictionary
, tetapi pengecualian akan dilemparkan jikaDictionary<string, string>
. Lihat posting SO yang dia sebutkan untuk informasi lebih lanjut, yang merupakan sumber edit ini.sumber
StringDictionary
daripadaDictionary<string, string>
?Masalah dengan contoh awal Anda terutama disebabkan oleh penggunaan
const
daripadastatic
; 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
readonly
adalah ide yang bagus juga, dan tidak ada pengubah yang dibahas di sini yang akan mencegah kamus itu sendiri untuk dimodifikasi.sumber
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"); } }
sumber
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"} }; } }
sumber
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 #.
sumber
OK - jadi saya bekerja di ASP 2.x (bukan pilihan saya ... tapi hei siapa yang mengomel?).
Tak satu pun dari contoh Dictionary inisialisasi akan berfungsi. Kemudian saya menemukan ini: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx
... yang membuat saya menyadari bahwa seseorang tidak dapat menggunakan inisialisasi koleksi di ASP 2.x.
sumber
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.
sumber