Ci sono diversi significati per null
.
Uno in linguaggi di programmazione che presentano variabili e memoria in un modo basato su puntatore (che include i riferimenti di C# anche se nasconde alcuni dettagli) è "questo non punta a nulla".
Un altro è "questo non ha un valore significativo".
Con i tipi di riferimento, spesso usiamo il primo per rappresentare quest'ultimo. Potremmo usare string label = null
per significare "nessuna etichetta significativa, ma rimane comunque anche una questione di cosa sta succedendo in termini di cosa c'è in memoria e cosa lo sta indicando.Eppure, è dannatamente utile, che peccato che noi non poteva farlo con int
e DateTime
in C# 1.1
Questo è quello che Nullable<T>
fornisce, un mezzo per dire "nessun valore significativo", ma a livello di sotto di essa non è null
nello stesso modo in una stringa null
è (a meno che non è stato assegnato a null ed è uguale a null, quindi è logicamente nullo e nullo in base ad altre semantiche, ma non è nullo nella differenza di implementazione "non fa riferimento a nulla" tra i tipi di riferimento e di valore
È solo l'aspetto "non fa riferimento a nulla" del tipo di riferimento null che impedisce di chiamare i metodi di istanza su di esso.
E in realtà, anche questo non è assolutamente vero. IL ti consente di chiamare i metodi di istanza su un riferimento null e finché non interagisce con nessun campo, funzionerà. Non può funzionare se ha bisogno (direttamente o indirettamente) quei campi dal momento che non esistono su un riferimento e nulla, ma potrebbe chiamare null.FineWithNull()
se questo metodo è stato definito come:
int FineWithNull()
{
//note that we don't actually do anything relating to the state of this object.
return 43;
}
Con C# è stato deciso per non farlo, ma non è una regola per tutti i .NET (penso che F # lo consenta, ma non ne sono sicuro, so che il C++ non gestito lo ha permesso ed è stato utile in alcuni casi molto rari).
fonte
2011-12-20 23:57:05
C'è un trucco davvero orribile per casi speciali con tipi nullable. Il runtime assegnerà automaticamente il loro valore interno durante la boxe. Ciò significa che "((object) x) .HasValue" genererà una NullReferenceException. È orribile. –
@KennetBelenky effettivamente '((oggetto) x). HasValue' non verrà compilato, perché non esiste una proprietà HasValue sull'oggetto. Penso che intendessi dire che '((oggetto) x) .ToString()' (o '.GetHashCode()' o '.Equalities (qualcosa)') genererà. – phoog
@phoog, oops Ero un po 'frettoloso nella mia descrizione. Hai ragione, la mia descrizione non è sintatticamente valida. Il punto, tuttavia, è che nel momento in cui lanci un Nullable su un oggetto, non è più un Nullable. Nessun altro tipo nel framework .Net ha quella proprietà. –