Tiendo a estar de acuerdo con Wyatt Barnett's answer en que debe mostrar restricción al crear este tipo de objetos "nulos". Dicho esto, hay algunas buenas razones para hacerlo. En ocasiones.
También tiendo a estar de acuerdo con Supertux's answer en que el objetivo de un objeto nulo es no tener que comprobar si es o no nulo, por lo que debe perder la propiedad IsNull. Si realmente siente que necesita la propiedad IsNull, lea la respuesta de Wyatt nuevamente y reconsidere.
Y gracias CraigTP for the nice links para más información. Buen material.
Ahora supondré que en su código real usted realmente tiene un constructor que está tratando de establecer los valores de Nombre o Especie (cualquiera que sea el equivalente de su código real). De lo contrario, ¿por qué recibiría la advertencia/error de "llamada de miembro virtual en el constructor"? Me he encontrado con un par de problemas similares al usar MyProperty {get; conjunto; } atajo yo mismo (particularmente cuando se usa en estructuras, y no me explico sobre el control de versiones de serialización). Su solución es no usar el atajo, sino hacerlo a la antigua.
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 { }
}
}
Esto resuelve el problema de establecer sus propiedades virtuales en el constructor. En su lugar, está configurando los valores de campo privados (algo que no tiene la capacidad de referencia si usa el acceso directo). Para obtener crédito adicional, compile ambos métodos y use el reflector para ver los ensamblados resultantes.
Cuanto más uso el {get; conjunto; } atajo, más me disgusta.
¿Cuál es el problema que está tratando de resolver? ¿Qué pasa con las referencias nulas, exactamente? – spoulson
http://www.refactoring.com/catalog/introduceNullObject.html – Sisiutl
Su propiedad IsNull en la clase NullAnimal debe ser una anulación, no una virtual. – TGnat