Statik bir sınıf içinde bir Sözlük bildirme


90

Statik bir sınıf içinde statik bir sözlük nesnesi nasıl bildirilir? denedim

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

Ancak derleyici, " dizeden başka bir başvuru türünün sabit alanı yalnızca boş değerle başlatılabilir " den şikayet eder .


1
Sabit'i Sözlük türü ile yalnızca skaler değerlerle kullanamazsınız. (cevabımı kontrol edin) msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx
Yona

Yanıtlar:


214

Sözlüğü bir kez ilan etmek ve hiçbir zaman değiştirmek istemiyorsanız, onu salt okunur olarak ilan edin:

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

Maddelerin salt okunur olmasını istiyorsanız (yalnızca referans değil, aynı zamanda koleksiyondaki öğeler), o zaman IDictionary uygulayan salt okunur bir sözlük sınıfı oluşturmanız gerekecektir.

Referans için ReadOnlyCollection'a bakın.

BTW const yalnızca satır içi skaler değerler bildirilirken kullanılabilir.


Sınıf düzeyinde özel statik değişken özel statik Dictionary <string, string> ErrorCodes'a sahip olmaya ve daha sonra ilgili işlevde, döngüde kullanıldığında değeri önbelleğe almak için (ErrorCodes == null) {fill dictionary} olup olmadığını kontrol etmeye ne dersiniz?
LifeOfPi

1
Sözlüğün değiştirilmesini istemiyorsanız, onu bir ReadOnlyDictionary. Daha verimli (ancak daha az güvenli bir seçenek), onu bir IReadOnlyDictionarytüre atamaktır .
Ramon de Klein

8

Doğru sözdizimi (VS 2008 SP1'de test edildiği gibi) şudur:

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

Ancak bu, tüketen bir sınıfın içeriği değiştirmesini engellemez.
Everts

4

Eski soru, ama bunu faydalı buldum. Bir Sözlük için hem anahtar hem de değer için bir dize kullanan özel bir sınıf olduğu ortaya çıktı:

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

Düzenleme: Aşağıdaki Chris'in yorumuna göre, Dictionary<string, string>üzerinde kullanmak StringDictionarygenellikle tercih edilir ancak durumunuza bağlı olacaktır. Daha eski bir kod tabanıyla uğraşıyorsanız StringDictionary,. Ayrıca, aşağıdaki satıra dikkat edin:

myDict["foo"]

eğer return null olacak myDictbir olduğunu StringDictionary, ancak bir istisna durumunda atılacaktır Dictionary<string, string>. Daha fazla bilgi için bahsettiği SO gönderisine bakın, bu düzenlemenin kaynağı budur.



Bu tam olarak bağlantılı olduğum soru.
Chris Morgan

1
Ha vay canına, onu anlayamadım bile - sadece aynısını buldum. Yorumu düzenleyemedim, bu yüzden yazıyı tek bir yerde özetleyecek şekilde düzenledim. Teşekkürler!
areyling

1

İlk örnekle sorun kullanımı kaynaklanmıştır constyerine static; C # 'da boş olmayan bir sabit referansı oluşturamazsınız.

Bunun da işe yarayacağına inanıyorum:

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

Ayrıca, Y Low'un işaret ettiği gibi, eklemek readonlyde iyi bir fikirdir ve burada tartışılan değiştiricilerin hiçbiri sözlüğün kendisinin değiştirilmesini engellemeyecektir.


1

Sözlüğe değer eklemek için statik bir kurucu oluşturun

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
soru veya sorgu?
Kül

0

Sözlüğünüzü başlatmak için statik / sınıf yapıcısını kullanabilirsiniz:

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
Sözlüğü statik yapmak mı istedin? Sahip olamazsın. Hata mesajının dediği gibi, yalnızca değer türleri, dizeler veya boş değerler sabit olabilir
Orion Edwards

0

Sözlüğü statik yapın ve ona statik nesnenizin ctor'unun dışına asla ekleme yapmayın. Bu, C # 'daki statik / const kurallarıyla uğraşmaktan daha basit bir çözüm gibi görünüyor.



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

Muhtemelen kurucuda başlatılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.