2016-04-19 16 views
0

Warum wird der Indexer eines IDictionary nicht auf die gleiche Weise implementiert?IDictionary Indexer nicht konsistent?

Betrachten Sie Dictionary<Key, Value> Wenn Sie versuchen, auf etwas zuzugreifen, das nicht existiert, wird eine KeyNotFoundException ausgelöst.

Wenn Sie das gleiche mit einem Hashtable tun, gibt es null zurück.

https://dotnetfiddle.net/0cp5K7

+1

'Hashtable' war in der ersten Version des Frameworks (1.1). 'Dictionary ' wurde in Version 2 des Frameworks eingeführt, was ein ziemlich wichtiges Update war. "Warum"? Sie müssen die Leute fragen, die 'Dictionary ' entworfen haben. Meine Vermutung ist so gut wie Ihre, aber es ist nicht unbekannt, dass Frameworks, die rückwärtskompatibel sind, im Laufe der Zeit inkonsistent werden. –

+2

Betrachten Sie die Tatsache, dass ein 'Dictionary' Paare wie <34, null> enthalten kann, und es hat eine Bedeutung ... Die Rückgabe von null, wenn der Schlüssel nicht existiert, wäre dann gefährlich ... –

Antwort

2

Zwei Hauptgründe: Generika und willkürliche Einschränkungen.

Erstens ist null für jeden Referenztyp ein perfekt gültiger Wert und unabhängig von der Existenz oder Nicht-Existenz eines Schlüssels in einem Wörterbuch. So begrenzt Hashtable Ihre Fähigkeit, zwischen einem Nicht-Vorhandensein und einem null Wert zu unterscheiden. Dies kann Fehler verbergen.

Zweitens ist der Dictionary-Typ generisch und erlaubt Werttypen. Werttypen haben keine Ahnung von null oder etwas ähnliches.

Als .NET Fortschritte machte, wurde mehr und mehr Gewicht auf die Verhinderung "schlechter Pfade" durch Code gelegt - was ambigere Dinge offensichtlich macht, indem man sie standardmäßig zu einem Fehler macht. dictionary[42] bedeutet "Ich nehme an, das Wörterbuch enthält den Schlüssel 42, und ich möchte den Wert mit dem Schlüssel verbunden", genau wie bedeutet "Ich nehme an, das Array enthält mindestens vier Elemente, und ich will die vierte". Hashtable 's Behandlung des Indexers ist das komische, nicht umgekehrt.

1

Es gibt wahrscheinlich viele Erklärungen und keine Antwort, aber: Wie würde ein Dictionary<string,int> return null?

Verwandte Themen