2009-05-20 7 views
9

In another SO question, Ich habe mehrere Leute gesehen, die mir empfehlen, TryGetValue immer zu verwenden.Soll ich TryGetValue immer verwenden, um auf .NET-Wörterbücher zuzugreifen?

Während ich TryGetValue immer über das Contains/Access-Muster verwende, vermeide ich dieses Muster absichtlich, wenn ich erwarte, dass der Schlüssel immer im Wörterbuch ist. Ich gehe dann für einen direkten Indexer-Zugang, so dass eine Ausnahme ausgelöst wird, wenn der Schlüssel nicht da ist, weil etwas unerwartetes wirklich passierte (d. H. Der Schlüssel war nicht im Wörterbuch, während ich es erwarte).

Da es einen allgemeinen Konsens gegen meine "best-practice" zu geben scheint (3 von 4 Personen auf dem Beitrag habe ich explizit empfohlen, TryGetValue zu jeder Zeit zu verwenden), bin ich gespannt auf eine ausführliche Diskussion zu lesen that topic ...

Antwort

13

Nein, Sie sind völlig richtig IMO.

Es gibt keinen Punkt dabei:

if (dict.TryGetValue(key, out value)) 
{ 
    // whatever 
} 
else 
{ 
    throw new SomeException("key '" + key + "' wasn't in dictionary"); 
} 

Der einzige Vorteil dieser über:

value = dict[key]; 

ist, dass Sie eine explizite Ausnahmemeldung ... aber auf Kosten der Lesbarkeit zu erhalten, IMO.

Es ist wie Gießen vs mit as - eine Ausnahme ist das richtige Ergebnis, wenn der Staat "falsch" ist, so verwenden Sie das Formular, das dieses Verhalten gibt.

+2

Sie können den eigentlichen Schlüssel zur Ausnahmebedingungsnachricht hinzufügen, wenn Sie TryGetValue/throw ausführen, was die standardmäßige KeyNotFoundException nicht leistet (es sei denn, mir fehlt etwas). – Skizz

1

Wenn die Abwesenheit eines Schlüssels außergewöhnlich ist, ist es in Ordnung, eine Ausnahme zu erheben, imho.

0

Wenn es ein außergewöhnliches Verhalten für den Schlüssel in Ihrem Wörterbuch nicht gibt (wie es klingt), dann ist es in Ordnung, die Ausnahme ausgelöst werden, wenn der Schlüssel nicht gefunden wird und lassen Sie diese Ausnahme in der Stapel. Wenn Sie eine defensive Programmierstil verwenden möchten, können Sie den folgenden verwenden, bevor Sie das Wörterbuch Schlüssel zugreifen:

Debug.Assert(Dictionary.ContainsKey(Key)); 

Sie nur wirklich brauchen TryGetValue zu verwenden, wenn Sie Situationen erwarten, wo der Schlüssel nicht vorhanden ist, oder wenn Sie möchte, dass ein bestimmter Code ausgeführt wird, wenn ein Schlüssel nicht existiert.

2

Wenn der Schlüssel voraussichtlich fehlt, führt die Verwendung von TryGetValue normalerweise zu einem saubereren und effizienteren Code. Wenn der Schlüssel erwartungsgemäß vorhanden ist, ist der direkte Indizierungszugriff normalerweise besser - die Ausnahme weist auf einen Fehler hin.

ContainsKey wird normalerweise nur verwendet, wenn der entsprechende Wert nicht benötigt wird.

Verwandte Themen