2010-12-17 22 views

Odpowiedz

25

Ponieważ słowniki generyczne mogą zawierać instancje typu wartości, a wartość null nie jest ważny dla typu wartości. Na przykład:

var dict = new Dictionary<string, DateTime>(); 
DateTime date = dict["foo"]; // What should happen here? date cannot be null! 

Należy zamiast tego użyć metody TryGetValue słownika:

var dict = new Dictionary<string, DateTime>(); 
DateTime date; 

if (dict.TryGetValue("foo", out date)) { 
    // Key was present; date is set to the value in the dictionary. 
} else { 
    // Key was not present; date is set to its default value. 
} 

również słownik, który przechowuje typów referencyjnych będzie nadal przechowywać wartości null. Twój kod może uważać "wartość jest pusta" za inną niż "klucz nie istnieje".

+0

To naprawdę nie rozwiązać przyczynę decyzji projektowych; mogliby po prostu łatwo przywrócić 'default (DateTime)' zamiast wartości zerowej. – Extragorey

+0

@Etradycyjne Tak, w szczególności ostatnie zdanie: niezależnie od wartości "nie znaleziono", być może trzeba zapisać tę wartość jako znaczącą. Jeśli pobranie klucza, który nie został znaleziony, zwraca 'default (DateTime)', wtedy nie można rozróżnić między "value is' default (DateTime) '" i "key is not present", przynajmniej bez dodatkowego wywołania do ' ContainsKey() '(co niepotrzebnie podwoiłoby koszt operacji). W przypadku słownika zawierającego typ odniesienia jako wartość, może "null" jest znaczącym stanem, z wyjątkiem "klucza nieobecnego". – cdhowie

+0

Dzięki temu wyjaśnienie ma więcej sensu. – Extragorey

3

Firma Microsoft zdecydowała, że ​​=)
Wykonaj kontrolę inline, aby tego uniknąć.

object myvalue = dict.ContainsKey(mykey) ? dict[mykey] : null; 
3

Przyczyna praktyczna: ponieważ słownik może przechowywać wartość pustą. W swoim scenariuszu nie można odróżnić tej sprawy od wyjątku.

Powiązane problemy