2010-12-17 15 views

Antwort

25

Da allgemeine Wörterbücher Instanzen eines Werttyps enthalten könnte, und null ist nicht gültig für einen Werttyp verwendet wird. Zum Beispiel:

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

Sie sollten stattdessen die TryGetValue Methode Wörterbuch verwenden:

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

Auch ein Wörterbuch, das Referenztypen speichert noch Nullwerte speichern. Und in Ihrem Code könnte "Wert ist null" anders sein als "Schlüssel ist nicht vorhanden".

+0

Dies bezieht dich nicht wirklich den Grund für die Design-Entscheidung; sie hätten es einfach schaffen können, 'default (DateTime)' anstelle von null zurückzugeben. – Extragorey

+0

@Extragorey Ja, insbesondere der letzte Satz: Was auch immer der Wert "nicht gefunden" ist, müssen Sie diesen Wert möglicherweise als sinnvoll speichern. Wenn das Abrufen eines Schlüssels, der nicht gefunden wird, "default (DateTime)" zurückgibt, können Sie nicht zwischen "value is' default (DateTime) "und" key is not present "unterscheiden, zumindest ohne einen zusätzlichen Aufruf von' ContainsKey() '(was die Kosten der Operation unnötig verdoppeln würde). Für ein Wörterbuch, das einen Referenztyp als Wert enthält, ist "null" möglicherweise ein bedeutungsvoller Zustand, abgesehen von "Schlüssel ist nicht vorhanden". – cdhowie

+0

Danke, diese Erklärung macht mehr Sinn. – Extragorey

3

Microsoft entschied, dass =)
Machen Sie einen Inline-Check, um das zu vermeiden.

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

Praktischer Grund: Weil ein Dictionary einen Nullwert speichern könnte. Sie könnten diesen Fall in Ihrem Szenario nicht mit einer Ausnahme unterscheiden.

Verwandte Themen