I dizionari (C # o altro) sono semplicemente un contenitore in cui si cerca un valore basato su una chiave. In molte lingue è identificato più correttamente come una mappa, l'implementazione più comune è una HashMap.
Il problema da considerare è ciò che accade quando non esiste una chiave. Alcune lingue si comportano restituendo nullo nilo altri valori equivalenti. Silenziosamente il default su un valore invece di informarti che un valore non esiste.
Nel bene e nel male, i progettisti della biblioteca C # hanno escogitato un linguaggio per affrontare il comportamento. Hanno sostenuto che il comportamento predefinito per la ricerca di un valore che non esiste è quello di generare un'eccezione. Se si desidera evitare eccezioni, è possibile utilizzare la Tryvariante. È lo stesso approccio che usano per analizzare le stringhe in numeri interi o oggetti data / ora. In sostanza, l'impatto è così:
T count = int.Parse("12T45"); // throws exception
if (int.TryParse("12T45", out count))
{
// Does not throw exception
}
E quello portato avanti nel dizionario, il cui indicizzatore 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
}
Questo è semplicemente il modo in cui è progettata la lingua.
Le outvariabili dovrebbero essere scoraggiate?
C # non è la prima lingua ad averli e hanno il loro scopo in situazioni specifiche. Se si sta tentando di creare un sistema altamente concorrente, non è possibile utilizzare le outvariabili ai limiti della concorrenza.
In molti modi, se esiste un idioma che è sposato dal fornitore di servizi linguistici e di librerie di base, provo ad adottare quegli idiomi nelle mie API. Ciò rende l'API più coerente e a suo agio in quella lingua. Quindi un metodo scritto in Ruby non sembrerà un metodo scritto in C #, C o Python. Ognuno di essi ha un modo preferito di costruire codice e lavorare con questo aiuta gli utenti dell'API a impararlo più rapidamente.
Le mappe in generale sono anti-pattern?
Hanno il loro scopo, ma molte volte potrebbero essere la soluzione sbagliata per lo scopo che hai. Soprattutto se hai una mappatura bidirezionale di cui hai bisogno. Esistono molti contenitori e modi per organizzare i dati. Esistono molti approcci che è possibile utilizzare e talvolta è necessario pensarci un po 'prima di scegliere quel contenitore.
Se hai un elenco molto breve di valori di mappatura bidirezionali, potresti aver bisogno solo di un elenco di tuple. O un elenco di strutture, in cui è possibile trovare facilmente la prima corrispondenza su entrambi i lati della mappatura.
Pensa al dominio problematico e scegli lo strumento più appropriato per il lavoro. Se non ce n'è uno, crealo.