validar validaciones una tener sobrecarga qué que puede propios privado polimorfismo objetos new net mvc metodos llamar herencia form español encapsulamiento ejemplos ejemplo destructores dataannotations data cuantos constructores con clases clase asp annotation abstracta c# validation class parameters base

validaciones - Validar el parámetro del constructor de la clase base C#



validation data annotation c# (5)

Después de ejecutar Code Analysis en VS2010 beta (FxCop para versiones anteriores) recibo la siguiente advertencia:

En el método visible externamente ''Identity.Identity (WindowsIdentity)'', valide el parámetro ''windowsIdentity'' antes de usarlo.

El constructor es:

public Identity(WindowsIdentity windowsIdentity) : base(windowsIdentity.Token) { init(); }

para una clase definida como:

public class Identity : WindowsIdentity

Mi pregunta es, ¿cómo valido el parámetro windowsIdentity? ¿Debería validarlo en el constructor y lanzar una excepción, o hay una forma mejor de llamar a esto?


Creo que FXCop informa este error aquí porque cree que puede encontrar una NullReferenceException accediendo a windowsIdentity cuando llama al constructor de la clase base.

Una forma de agregar una verificación de validación para null sería agregar una función privada estática a su clase que pueda verificar el parámetro de WindowsIdentity para nulo y tomar las medidas apropiadas:

private static WindowsIdentity ValidateIdentity( WindowsIdentity identity ) { if( identity == null ) throw new ArgumentNullException( "identity" ); // possibly some other validation checks here... return identity; } public Identity(WindowsIdentity windowsIdentity) : base( ValidateIdentity( windowsIdentity ).Token ) { init(); }

Otro enfoque sería usar el operador ternario para verificar el parámetro, como en:

public Identity(WindowsIdentity windowsIdentity) : base( windowsIdentity == null ? null : windowsIdentity.Token ) { init(); }

Pero, ¿qué deberías preguntarte a ti mismo realmente es qué harías? Si simplemente va a lanzar una excepción, puede estar bien permitir que el código permanezca como está, ya que a través de una NullReferenceException si el argumento es nulo.


La policía de FX le dice que el parámetro no puede ser nulo, por lo que si realmente lo necesita, debe validarlo de alguna manera. Dado que lo está utilizando en el constructor, probablemente desee un valor diferente de nulo, por lo que debe validarlo allí para que la detención de la policía FX le moleste.

Si necesita un constructor con nulo, debería tener otro constructor sin parámetros.

Si no lo está usando o lo está validando en otro punto, puede omitir la alerta.

Para evitar el problema con FXcop, debería lanzar ArgumentNullException.


Puede validarlo en un método estático:

public Identity(WindowsIdentity windowsIdentity) : base(GetToken(windowsIdentity)) { init(); } static Token GetToken(WindowsIdentity ident) { if(ident == null) throw new ArgumentNullException("ident"); return ident.Token; }

(No me molesté en buscar el tipo de WindowsIdentity.Token, pero entiendes la idea)


Se está quejando porque si pasa NULL como WindowsIdentity, cuando el constructor encadena a la clase base emitirá una excepción de referencia nula.

La mejor manera de lidiar con esto depende de tu diseño. Usted podría verificarlo por nulo así:

:base(windowsIdentity == null ? null : windowsIdentity.Token)

O podría hacer otro constructor en el constructor de la clase base que tome una WindowsIdentity como parámetro, y haga que ese constructor haga esa parte de la validación. Básicamente, hay muchísimas formas de lidiar con eso, solo usa lo que funcione mejor en tu situación.


A partir de C # 6.0 puede usar el operador nulo-coalescente combinado con el operador nulo-condicional como este:

public Identity(WindowsIdentity winIdentity) : base(winIdentity?.Token ?? throw new ArgumentNullException(nameof(winIdentity))) { init(); }