2017-12-17 3 views
0

Angenommen, wir haben ein Wörterbuch mit einer Klasse als Schlüssel und Index, und wir möchten das Element zurückgeben, wenn das Element vorhanden ist, sonst geben Sie null zurück. Welche davon ist effizienter?Ist eine KeyNotFoundException effizienter als die Überprüfung, ob der Schlüssel existiert?

if(myDictionary.ContainsKey(myKey)) 
    return myDictionary[myKey]; 
return null; 

oder

try { return myDictionary[myKey]; } 
catch { return null; } 
+2

Wenn ich rate, ist das Aufwickeln des Stapels teurer als ein Hash-Lookup. Es gibt nur einen Weg, das herauszufinden! –

+4

Sie können immer 'TryGetValue' verwenden wie 'if (myDict.TryGetValue (k, out v)) return v; else return null; ' – dcg

+3

Wenn Sie eine Möglichkeit haben, eine Ausnahme zu vermeiden, verwenden Sie sie. – Steve

Antwort

3

Während Effizienz ein Anliegen ist, die in der Software-Entwicklung in Betracht gezogen werden sollte, ist es nicht der einzige. Wenn es keine Einschränkungen wie Leistungsanforderungen oder das Speichern von Akkus auf einem eingebetteten oder mobilen Gerät gibt, stehen in der Regel andere nicht funktionale Anforderungen an erster Stelle. Die Wartbarkeit (und damit die Verständlichkeit Ihres Codes) hat normalerweise eine höhere Priorität.

In Anbetracht dessen sollten Sie sich nicht auf eine Option beschränken. Verwenden Sie TryGet, wenn es kein Fehler ist, wenn der Wert im Wörterbuch nicht vorhanden ist. Verwenden Sie den Indexer, wenn Sie einen fehlenden Wert als Fehler betrachten.

Nachdem gesagt, dass, wenn Sie die the reference source für die tatsächliche Implementierung überprüfen, erhalten beide den Indexer und TryGet den Wert aus der FindEntry. TryGet akquiriert den Standardwert (billig) und gibt zurück. Der Indexer gibt nicht nur zurück, sondern zusätzlich löst eine Ausnahme aus. Das macht es teurer.

Verwandte Themen