Jak zadeklarować statyczny obiekt słownika w klasie statycznej? próbowałem
public static class ErrorCode
{
public const IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>()
{
{ "1", "User name or password problem" }
};
}
Jednak kompilator narzeka, że „ Pole const typu referencyjnego innego niż łańcuch może być zainicjowane tylko wartością null ”.
c#
.net
dictionary
Graviton
źródło
źródło
Odpowiedzi:
Jeśli chcesz raz zadeklarować słownik i nigdy go nie zmieniać, zadeklaruj go jako tylko do odczytu:
private static readonly Dictionary<string, string> ErrorCodes = new Dictionary<string, string> { { "1", "Error One" }, { "2", "Error Two" } };
Jeśli chcesz, aby elementy ze słownika były tylko do odczytu (nie tylko jako odniesienie, ale także elementy w kolekcji), musisz utworzyć klasę słownika tylko do odczytu, która implementuje IDictionary.
Sprawdź ReadOnlyCollection w celach informacyjnych.
BTW const może być używane tylko podczas deklarowania wartości skalarnych w tekście.
źródło
ReadOnlyDictionary
. Bardziej wydajną (ale mniej bezpieczną opcją) jest przypisanie jej doIReadOnlyDictionary
typu.Prawidłowa składnia (zgodnie z testami w VS 2008 SP1) jest następująca:
public static class ErrorCode { public static IDictionary<string, string> ErrorCodeDic; static ErrorCode() { ErrorCodeDic = new Dictionary<string, string>() { {"1", "User name or password problem"} }; } }
źródło
Stare pytanie, ale uznałem to za przydatne. Okazuje się, że istnieje również wyspecjalizowana klasa dla Dictionary, która używa ciągu znaków zarówno dla klucza, jak i wartości:
private static readonly StringDictionary SegmentSyntaxErrorCodes = new StringDictionary { { "1", "Unrecognized segment ID" }, { "2", "Unexpected segment" } };
Edycja: Zgodnie z komentarzem Chrisa poniżej, używanie
Dictionary<string, string>
overStringDictionary
jest generalnie preferowane, ale zależy od twojej sytuacji. Jeśli masz do czynienia ze starszą bazą kodu, możesz być ograniczony doStringDictionary
. Zwróć również uwagę, że następujący wiersz:myDict["foo"]
zwróci wartość null, jeśli
myDict
jest aStringDictionary
, ale zostanie zgłoszony wyjątek w przypadkuDictionary<string, string>
. Zobacz wpis SO, o którym wspomniał, aby uzyskać więcej informacji, który jest źródłem tej zmiany.źródło
StringDictionary
zamiastDictionary<string, string>
?Problem z twoim początkowym przykładem wynikał głównie z użycia
const
zamiaststatic
; nie można utworzyć odwołania do const niezerowego w języku C #.Myślę, że to również zadziałałoby:
public static class ErrorCode { public static IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>() { {"1", "User name or password problem"} }; }
Ponadto, jak wskazuje Y Low, dodawanie
readonly
jest również dobrym pomysłem i żaden z omawianych tutaj modyfikatorów nie uniemożliwi modyfikacji samego słownika.źródło
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"); } }
źródło
Możesz użyć konstruktora static / class, aby zainicjować swój słownik:
public static class ErrorCode { public const IDictionary<string, string> ErrorCodeDic; public static ErrorCode() { ErrorCodeDic = new Dictionary<string, string>() { {"1", "User name or password problem"} }; } }
źródło
Stwórz słownik jako statyczny i nigdy nie dodawaj do niego poza ctorem obiektu statycznego. Wydaje się, że jest to prostsze rozwiązanie niż majstrowanie przy regułach statycznych / stałych w C #.
źródło
OK - więc pracuję w ASP 2.x (nie mój wybór ... ale hej, kto narzeka?).
Żaden z przykładów inicjowania słownika nie działał. Wtedy trafiłem na to: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx
... co zafascynowało mnie, że w ASP 2.x nie można używać inicjalizacji kolekcji.
źródło
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"} }; } }
Prawdopodobnie zainicjalizuj w konstruktorze.
źródło