2009-12-17 18 views
8

Después de ejecutar el análisis de código en VS2010 beta (FxCop para las versiones anteriores) Estoy consiguiendo la siguiente advertencia:Validando C# base de parámetro constructor de la clase

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 define 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?

Respuesta

12

puede validar 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; 
} 

(que no se molestan en buscar el tipo de WindowsIdentity.Token, pero se entiende la idea)

2

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

Una forma de añadir una comprobación de validación de nula sería añadir una función privada estática a su clase que eso puede comprobar el parámetro WindowsIdentity por nula y tomar la acción apropiada:

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 utilizar el operador ternario para verificar el parámetro, como en:

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

Pero, lo que realmente debe hacerse 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 un NullReferenceException si el argumento es nulo.

1

Se queja porque si pasa NULL como windowsIdentity, cuando el constructor encadena a la clase base lanzará una excepción de referencia nula.

La mejor manera de manejarlo depende de su diseño. Usted puede comprobar por nula la siguiente manera:

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

O usted podría hacer otro constructor en el constructor de la clase base que lleva un WindowsIdentity como parámetro, y tienen que hacer constructor de 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.

0

FX policía está diciendo usted que el parámetro no puede ser nulo, por lo que si realmente lo necesita debe validarlo de alguna manera. Puesto que lo está utilizando en el constructor, probablemente desee un valor diferente de nulo, por lo que debe validarlo allí para que FX cop stop lo moleste ...

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

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

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

Cuestiones relacionadas