Dicionários (C # ou outros) são simplesmente um contêiner onde você procura um valor com base em uma chave. Em muitos idiomas, é mais corretamente identificado como um mapa, com a implementação mais comum sendo um HashMap.
O problema a considerar é o que acontece quando uma chave não existe. Alguns idiomas se comportam retornando null
ou nil
ou algum outro valor equivalente. Predefinir silenciosamente um valor em vez de informar que um valor não existe.
Para o bem ou para o mal, os designers da biblioteca C # criaram um idioma para lidar com o comportamento. Eles argumentaram que o comportamento padrão para procurar um valor que não existe é lançar uma exceção. Se você deseja evitar exceções, pode usar a Try
variante. É a mesma abordagem usada para analisar seqüências de caracteres em números inteiros ou objetos de data / hora. Essencialmente, o impacto é assim:
T count = int.Parse("12T45"); // throws exception
if (int.TryParse("12T45", out count))
{
// Does not throw exception
}
E isso foi transferido para o dicionário, cujo indexador delega para Get(index)
:
var myvalue = dict["12345"]; // throws exception
myvalue = dict.Get("12345"); // throws exception
if (dict.TryGet("12345", out myvalue))
{
// Does not throw exception
}
É assim que o idioma é projetado.
As out
variáveis devem ser desencorajadas?
C # não é o primeiro idioma para tê-los e eles têm seu objetivo em situações específicas. Se você estiver tentando criar um sistema altamente simultâneo, não poderá usar out
variáveis nos limites de simultaneidade.
De várias maneiras, se houver um idioma adotado pelos fornecedores de idiomas e bibliotecas principais, tento adotar esses idiomas nas minhas APIs. Isso faz com que a API se sinta mais consistente e em casa nesse idioma. Portanto, um método escrito em Ruby não será parecido com um método escrito em C #, C ou Python. Cada um deles tem uma maneira preferida de criar código, e trabalhar com isso ajuda os usuários da sua API a aprendê-lo mais rapidamente.
Os mapas em geral são um antipadrão?
Eles têm seu objetivo, mas muitas vezes podem ser a solução errada para o objetivo que você tem. Particularmente se você tiver um mapeamento bidirecional, precisará. Existem muitos contêineres e maneiras de organizar dados. Existem muitas abordagens que você pode usar e, às vezes, precisa pensar um pouco antes de escolher esse contêiner.
Se você tiver uma lista muito curta de valores de mapeamento bidirecional, poderá precisar apenas de uma lista de tuplas. Ou uma lista de estruturas, onde você pode encontrar facilmente a primeira correspondência nos dois lados do mapeamento.
Pense no domínio do problema e escolha a ferramenta mais apropriada para o trabalho. Se não houver, crie-o.