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 null
o nil
o 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 Try
variante. È 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 out
variabili 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 out
variabili 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.