Si potrebbe evitare di usare nulla e creare una speciale classe di valori Singleton che fa la stessa cosa. Per esempio:
public sealed class Nothing
{
public static readonly Nothing Value = new Nothing();
private Nothing() {}
}
Dictionary<object, string> dict = new Dictionary<object, string>();
dict.add(Nothing.Value, "Nothing");
dict.add(1, "One");
Questo approccio non funzionare affatto se avete intenzione di fare la vostra collezione più fortemente tipizzato - diciamo ad esempio, si desidera che la chiave per essere una stringa. Poiché la stringa è sigillata, non è possibile ereditarla per creare un sostituto "valore speciale" per null. Le tue alternative diventano un po 'più complicate. È possibile:
- Creare un valore costante speciale per rappresentare il caso "vuoto"/"nulla". Tipo di hacky e sicuramente un percorso di confusione. Questo può essere un approccio praticabile se il dizionario è completamente privato per alcune classi di implementazione ed è possibile scrivere alcuni metodi di utilità di codifica/decodifica per evitare di diffondere la conoscenza di come si traducono le chiavi dappertutto.
- Creare la propria implementazione di IDictionary che delega internamente a un dizionario <> istanza - tranne che per il caso di null. Ciò viola le aspettative documentate per l'interfaccia IDictionary < che dice che le chiavi Null dovrebbero generare un'eccezione. Ma potresti riuscire a farla franca se è l'unico modo per risolvere il tuo vero problema. Funziona solo se possiedi e crea l'istanza del dizionario.
- Trova un modo per risolvere il tuo problema senza memorizzare una chiave "nulla" nel dizionario. Ad esempio, si consideri di non popolare la chiave nulla nel dizionario e di avere una logica caso-caso per affrontarla. Le chiavi devono essere lavabili e paragonabili a lavorare con l'implementazione sottostante, ed è per questo motivo che Null è proibito normalmente.
Come parte, la chiave del tuo dizionario ha davvero bisogno che la chiave sia object
? Ciò può portare a bug sottili a causa dell'uguaglianza di riferimento utilizzata laddove è possibile che sia previsto che Equals() sia valutato come base per il confronto.
Solo curioso in cui avete bisogno di questo? Grazie –