Los diccionarios (C # o de otra manera) son simplemente un contenedor donde busca un valor basado en una clave. En muchos idiomas, se identifica más correctamente como un mapa, siendo la implementación más común un HashMap.
El problema a considerar es qué sucede cuando una clave no existe. Algunos idiomas se comportan mediante la devolución null
o nil
o algún otro valor equivalente. En silencio, el valor predeterminado es un valor en lugar de informarle que un valor no existe.
Para bien o para mal, los diseñadores de la biblioteca de C # idearon un modismo para lidiar con el comportamiento. Razonaron que el comportamiento predeterminado para buscar un valor que no existe es lanzar una excepción. Si desea evitar excepciones, puede usar la Try
variante. Es el mismo enfoque que utilizan para analizar cadenas en enteros u objetos de fecha / hora. Esencialmente, el impacto es así:
T count = int.Parse("12T45"); // throws exception
if (int.TryParse("12T45", out count))
{
// Does not throw exception
}
Y eso se trasladó al diccionario, cuyo indexador delega a Get(index)
:
var myvalue = dict["12345"]; // throws exception
myvalue = dict.Get("12345"); // throws exception
if (dict.TryGet("12345", out myvalue))
{
// Does not throw exception
}
Esta es simplemente la forma en que se diseña el lenguaje.
¿Deben out
desalentarse las variables?
C # no es el primer idioma que los tiene, y tienen su propósito en situaciones específicas. Si está tratando de construir un sistema altamente concurrente, entonces no puede usar out
variables en los límites de concurrencia.
En muchos sentidos, si hay un idioma que es adoptado por el idioma y los proveedores de la biblioteca central, trato de adoptar esos idiomas en mis API. Eso hace que la API se sienta más consistente y como en casa en ese idioma. Entonces, un método escrito en Ruby no se verá como un método escrito en C #, C o Python. Cada uno tiene una forma preferida de construir código, y trabajar con eso ayuda a los usuarios de su API a aprenderlo más rápidamente.
¿Son los mapas en general un antipatrón?
Tienen su propósito, pero muchas veces pueden ser la solución incorrecta para el propósito que usted tiene. Particularmente si tiene un mapeo bidireccional que necesita. Hay muchos contenedores y formas de organizar los datos. Hay muchos enfoques que puede usar, y a veces necesita pensar un poco antes de elegir ese contenedor.
Si tiene una lista muy corta de valores de mapeo bidireccional, es posible que solo necesite una lista de tuplas. O una lista de estructuras, donde puede encontrar fácilmente la primera coincidencia a cada lado de la asignación.
Piense en el dominio del problema y elija la herramienta más adecuada para el trabajo. Si no hay uno, créelo.