Warum tut Wörterbuch[index] wirft eine KeyNotFoundException aber Hashtable[index] funktioniert nicht?
Eine Idee warum das Verhalten anders ist?
- Würde gerne wissen, die die gleiche X-)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Idee warum das Verhalten anders ist?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist die Antwort.
HashTable
erlaubt zu schreiben unsafer-code in dieser Art und Weise.var ht = new Hashtable() {{"A", null}}; string aVal = (string)ht["A"]; string bVal = (string)ht["B"];
Beide zurücknull
Sie können nicht unterscheiden zwischen einem gültigen Wert oder einen nicht vorhandenen Schlüssel. Zumindest der Fehler verborgen ist und lautlos, die ist noch schlimmer, das Wörterbuch wird Ihnen sagen, mit einer Ausnahme.So wird es keine Zweideutigkeit zwischen, wenn der Wert des dictionary[key] speichert einen Nullwert, und wenn der Schlüssel nicht vorhanden. Hashtable[key] wird null zurückgeben, falls es speichert null ist, oder der Schlüssel nicht existieren.
Den primären Grund Wörterbuch wirft, wird politisch - hatte mehrere Optionen zu bewahren, Effizienz und Benutzerfreundlichkeit. Tatsächlich bietet sich eine Methode TryGetValue), die eindeutig zeigt, dass Behauptungen über die angebliche "Unfähigkeit", um wieder vernünftig mit dem Wert false sind. TryGetValue jedoch Kräfte unverwechselbar unangenehme syntax zu tun genau das, was indexer könnte leicht getan.
C# - Vorlagen bieten eine einfache Möglichkeit für den Bau von separaten Implementierungen für Referenz-und Wert-Semantik, und es gibt zwei andere Einrichtungen für die nahtlose Behandlung von fehlenden Objekte mit Wert semantice die tempates und einige Operatoren (Standard-und null-Werte zulässt). Was bedeutet, dass es keinen rationalen Grund zu brechen, die die Semantik der hashtable.
Es ist eine lange politische Auseinandersetzung zwischen den wissenschaftlichen Begriff einer Sammlung, die betont, dass jeder hat zu gehen durch "tun Sie es" checks and real-life Tatsache, dass solche künstlichen Verfahren ist ineffizient und bricht thread-Sicherheit - in-Prinzip (es bricht thread-Sicherheit der sonst sichere Implementierungen, indem der Zugang der nicht-atomaren).
TryXX
Muster angegeben, dass die Methode zurückgeben solldefault(T)
im Falle des Scheiterns, sondern verwenden Sie eineout bool
parameter geben Sie an, ob es funktioniert hat. Dies würde es ermöglichenbook ok; var theValue = myDict.TryGetValue(myKey, out ok); if (ok) ...
. Ein solches Muster würde es erlauben, sowohl die Typ-Inferenz und Kovarianz, und erleichtern auch den Fall, wo das gewünschte Verhalten für einen nicht-existenten Schlüssel ist, um zu gehen von einem Wert vondefault(T)
.