2009-11-09 23 views

Respuesta

16

Aquí está el answer.

La razón principal Diccionario lanza es que no hay valor "error" que funciona sobre cualquier V. tabla hash es capaz de devolver null porque la clave es siempre una referencia tipo.

+0

Merece la pena señalar: 'HashTable' permite escribir código no seguro de esta manera. 'var ht = new Hashtable() {{" A ", null}}; cadena aVal = (cadena) ht ["A"]; string bVal = (string) ht ["B"]; 'Ambos devuelven' null', no se puede diferenciar entre un valor válido o una clave no existente. Al menos el error está oculto y en silencio, lo que es aún peor, el diccionario te dirá con una excepción. –

6

De modo que no habrá ambigüedades entre cuando el valor del diccionario [clave] almacena un valor nulo y cuando la clave no existe. Hashtable [tecla] devolverá nulo si almacena nulo o la clave no existe.

2

La razón principal por la que Dictionary arroja es política: tenía varias opciones para preservar la eficiencia y la facilidad de uso. En realidad, proporciona un método (TryGetValue) que demuestra claramente que las afirmaciones sobre la supuesta "incapacidad" para devolver el valor razonable son falsas. Sin embargo, TryGetValue obliga a la sintaxis distintivamente torpe a hacer exactamente lo que el indexador podría haber hecho fácilmente.

Las plantillas C# proporcionan una forma sencilla de construir implementaciones separadas para la semántica de referencia y valor y hay otras dos facilidades para el manejo sin interrupciones de objetos faltantes con valor semántico utilizados por tempates y algunos operadores (por defecto y nulable). Lo que significa que no había una razón racional para romper la semántica de la tabla hash.

Es una lucha política a largo plazo entre la noción académica de una colección que insiste en que todo el mundo tiene que someterse a comprobaciones de "lo tienes" y hechos reales que dicho procedimiento artificial es ineficaz y rompe la seguridad del hilo. (rompe la seguridad de subprocesos de implementaciones que de otro modo serían seguras al hacer que los accesos no sean atómicos).

+2

Deseo que el patrón 'TryXX' especifique que el método debe devolver' default (T) 'en caso de error, pero use un parámetro' out bool' para indicar si funcionó. Esto permitiría 'reservar bien; var theValue = myDict.TryGetValue (myKey, sale bien); si (ok) ... '. Tal patrón permitiría tanto la inferencia de tipo como la covarianza, y también facilitaría el caso donde el comportamiento deseado para una clave inexistente es asumir un valor de 'default (T)'. – supercat