Come sottolineato da @svick, non si dovrebbero usare eccezioni per il controllo del flusso.
L'approccio n. 2 ha anche introdotto un potenziale bug nel codice, o almeno un comportamento che non hai previsto (entrambi sono sinonimi per me).
Il fatto è che il tentativo di duplicare una chiave non è l'unico caso in cui Dictionary
genererebbe un ArgumentException
. Un altro sta tentando di aggiungere null
a Dictionary
(nel qual caso viene lanciata una ArgumentNullException
, ma è una sottoclasse di ArgumentException
, quindi sarà ancora gestita dalla tua clausola catch
).
I dizionari in C # non accettano null come chiavi. Se i
è nullo, allora abbiamo alcune informazioni che non possono essere mantenute in dict
, e potrebbe indicare che c'è qualcosa di sbagliato altrove nel tuo codice. Ma questo pezzo di codice che hai postato trascura questo importante segnale di avvertimento, rendendo più difficile identificare la causa principale del bug in futuro.
Questa è un'altra ragione per non fare affidamento sulle eccezioni quando non ne hai bisogno, specialmente non fare affidamento su di esse nel modo in cui il codice può ignorarle ...
E infine, ti suggerirei di utilizzare il terzo approccio:
dict[i] = true;
Sicuramente il più pulito. Lo sapresti se dai un'occhiata a la documentazione .
Controllare la documentazione è il modo migliore per evitare di reinventare la ruota. Non hai bisogno di inventare il tuo "modello", è già lì per te.
(Con questa soluzione presumo che il tuo codice non debba mai riportare alcun valore su false
- i frammenti che hai postato non lo implicano).