tendo a concordare con Wyatt Barnett's answer in che si dovrebbe dar prova di moderazione durante la creazione di questo tipo di oggetti "nulli". Detto questo, ci sono alcune buone ragioni per farlo. All'occasione.
Tendo anche a concordare con Supertux's answer in quanto il punto intero di un oggetto nullo non è necessario verificare se è nullo, quindi è necessario perdere la proprietà IsNull. Se ritieni davvero di aver bisogno della proprietà IsNull, allora leggi di nuovo la risposta di Wyatt e riconsidera.
E grazie CraigTP for the nice links per ulteriori informazioni. Roba buona.
Ora assumerò che nel proprio codice reale ci sia effettivamente un costruttore che sta tentando di impostare i valori di Nome o Specie (qualunque sia il nome del tuo vero codice equivalente). Altrimenti, perché dovresti ricevere l'avviso/errore "Chiamata virtuale nel costruttore"? Ho riscontrato un paio di problemi simili durante l'utilizzo di MyFrontty newfangled {get; impostato; } scorciatoia me stesso (in particolare se usato nelle strutture e non mi fa iniziare sulla versione della serializzazione). La soluzione è non utilizzare la scorciatoia, ma farlo alla vecchia maniera.
public class Animal {
protected Animal() { }
public Animal(string name, string species) {
_Name = name;
_Species = species;
}
public virtual string Name {
get { return _Name; }
set { _Name = value; }
}
private string _Name;
public virtual string Species {
get { return _Species; }
set { _Species = value; }
}
private string _Species;
}
public sealed class NullAnimal : Animal {
public override string Name {
get { return String.Empty; }
set { }
}
public override string Species {
get { return String.Empty; }
set { }
}
}
Questo risolve il problema di impostare le proprietà virtuali nel costruttore. Invece, si impostano i valori dei campi privati (qualcosa che non si ha la possibilità di fare riferimento se si utilizza il collegamento). Per ulteriore credito, compilare entrambi i metodi e utilizzare Reflector per esaminare gli assembly risultanti.
Più uso il {get; impostato; scorciatoia, più mi piace.
fonte
2009-07-24 21:53:41
Qual è il problema che stai cercando di risolvere? Cosa c'è di sbagliato con i riferimenti null, esattamente? – spoulson
http://www.refactoring.com/catalog/introduceNullObject.html – Sisiutl
La proprietà IsNull nella classe NullAnimal deve essere di tipo override, non virtuale. – TGnat