2009-05-20 11 views
9

En another SO question, He visto a varias personas recomendarme usar siempre TryGetValue.¿Debo usar siempre TryGetValue para acceder a los diccionarios .net?

Aunque siempre uso TryGetValue sobre el patrón Contiene?/Acceso, evito este patrón a propósito cuando espero que la clave siempre esté en el diccionario. Luego busco un acceso directo al indexador, de modo que se genera una excepción si la clave no está allí, porque realmente sucedió algo inesperado (es decir, la clave no estaba en el diccionario mientras esperaba).

Dado que parece haber un consenso general en contra de mis "mejores prácticas" (3 de cada 4 personas en la publicación que mencioné explícitamente recomendaron usar TryGetValue en todo momento), estoy ansioso por leer una discusión extensa sobre ese tema ...

Respuesta

13

No, usted tiene toda la razón IMO.

No hay razón para hacer:

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

El único beneficio de aquello sobre: ​​

value = dict[key]; 

es que se obtiene un mensaje de excepción más explícita ... pero a costa de la legibilidad, IMO.

Es como lanzar vs usar as - una excepción es el resultado correcto cuando el estado es "incorrecto", así que use el formulario que da ese comportamiento.

+2

Puede agregar la clave real al mensaje de excepción si realiza TryGetValue/throw, que es algo que la excepción KeyNotFoundException predeterminada no puede hacer (a menos que me falta algo). – Skizz

1

Si la ausencia de una clave es excepcional, está bien hacer una excepción, yo.

0

Si es un comportamiento excepcional que la clave no exista en el diccionario (que es lo que suena), entonces está bien permitir que la excepción se active si la clave no se encuentra y permitir que esa excepción se propague por el apilar. Si desea utilizar una práctica programación defensiva, podría utilizar el siguiente antes de acceder a la clave de diccionario:

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

Sólo realmente necesita usar TryGetValue si espera que las situaciones en las que no puede existir la tecla, o si quiere que se ejecute cierto código en el caso de que una clave no exista.

2

Si se espera que falte la clave, el uso de TryGetValue generalmente resulta en un código más limpio y eficiente. Si se espera que la clave esté presente, el acceso de indexación directa suele ser mejor; la excepción indica un error.

ContainsKey generalmente solo se utiliza si no se necesita el valor correspondiente.

Cuestiones relacionadas