c# - typeparam - ¿Propiedades auto-implementadas con cláusula de protección no nula?
summary parameters c# (3)
Asumiría que las propiedades son solo un búfer de memoria desde el punto de vista del usuario. solo cuando se invoca un método (acción) en el código de usuario, luego se debe verificar la validez del búfer de propiedades (por ejemplo, la excepción de tiradas nulas de verificación).
su establecedor de propiedades debe colocar un valor no válido para el miembro interno si los datos asignados no son válidos (en su diseño de algoritmo). la comprobación y devolución de errores deben provenir del método que utiliza este valor de propiedad
Estoy de acuerdo con la idea de Mark Seeman de que las propiedades automáticas son algo malvadas ya que rompen la encapsulación. Sin embargo, me gusta la sintaxis concisa, la legibilidad y la comodidad que aportan.
Yo cito:
public string Name { get; set; }
El problema con el fragmento de código no es que contenga demasiada ceremonia. El problema es que rompe la encapsulación. De hecho
"[...] los captadores y definidores no logran encapsularse ni ocultarse información: son una forma legitimada por el lenguaje de violarlos".
James O. Coplien y Gertrud Bjørnvig. Arquitectura magra Wiley 2010. p. 134.
La mayoría de las veces, agregar una cláusula de protección no nula es lo suficientemente bueno para un establecedor de propiedades y me gustaría saber si hay una mejor manera de hacerlo que una de las siguientes. Por mejor, quiero decir de una manera más concisa / menos repetitiva.
Usando Contratos de Código:
private string _username;
public virtual string Username
{
get { return _username; }
set
{
Contract.Requires(value != null);
_username = value;
}
}
Utilizando vainilla .NET:
private string _username;
public virtual string Username
{
get { return _username; }
set
{
if (value == null) throw new ArgumentNullException("Username");
_username = value;
}
}
Citaré el manual de Contratos de Código , § 2.3.1:
public int MyProperty { get; private set ; }
[ContractInvariantMethod]
private void ObjectInvariant ()
{
Contract. Invariant ( this.MyProperty >= 0 );
...
}
Podría usar aspectos de PostSharp para decorar el establecedor de propiedades con una comprobación nula: