Devo usare default (Foo), Foo.Empty o null?
-
06-07-2019 - |
Domanda
Quindi C # ora ti permette di usare default(Foo)
per ottenere un " riconosciuto; non ancora compilato " / un'istanza vuota di una classe - non sono sicuro che sia esattamente lo stesso come new Foo()
o no. Molte classi di librerie implementano anche una proprietà Foo.Empty
, che restituisce un'istanza simile. E ovviamente qualsiasi tipo di riferimento può puntare a null
. Quindi davvero, qual è la differenza? Quando uno ha ragione o torto? Cosa c'è di più coerente o funziona meglio? Quali test devo usare per verificare se un oggetto è concettualmente & Quot; non pronto per il tempo di prima serata & Quot ;? Non tutti hanno Foo.IsNullOrEmpty()
.
Soluzione
default(Foo)
restituirà null quando Foo
è un tipo di classe, zero dove default()
è un tipo di valore (come int) e un'istanza di SomeClass<T>
con tutti i campi inizializzati su loro rispettivi MyMethod<T>
valori in cui String.Empty
è una struttura. È stato aggiunto al linguaggio in modo che i generici potessero supportare sia il valore che i tipi di riferimento - altro informazioni su MSDN
Usa ""
quando stai testando una T nel contesto di <=> o <=> e non sai se T sarà un tipo di valore, un tipo di classe o una struttura.
Altrimenti, null dovrebbe significare " sconosciuto " e vuoto dovrebbe significare " So che questo è vuoto " ;. Usa il modello Foo.Empty se hai davvero bisogno di un'istanza vuota - ma non nulla - della tua classe; per esempio. <=> in alternativa a <=> se è necessario inizializzare alcune variabili nella stringa vuota.
Usa null se sai che stai lavorando con tipi di riferimento (classi), non ci sono generici coinvolti e stai testando esplicitamente riferimenti non inizializzati.
Altri suggerimenti
Quando conosci il tipo effettivo coinvolto, o se hai un parametro di tipo vincolato con " ;: class " è più semplice usare il valore noto (null, 0 ecc.).
Quando hai appena ottenuto un parametro di tipo non vincolato o vincolato diverso da un tipo di riferimento, devi utilizzare il valore predefinito (T).
default(Foo)
funziona sia per i tipi di valore che per i tipi di riferimento. New Foo(), null
e Foo.Empty()
no. Questo lo rende una buona scelta per l'uso con tipi generici, ad esempio, quando potresti non sapere con chi hai a che fare. Ma nella maggior parte dei casi di tipo di riferimento, null
è probabilmente abbastanza buono.