2009-12-17 4 views
8

Après l'exécution de code Analyse en version bêta VS2010 (FxCop pour les versions précédentes) Je reçois l'avertissement suivant:Validating C# paramètre constructeur de la classe de base

Dans l'extérieur méthode visible 'Identity.Identity (WindowsIdentity)', valider le paramètre 'windowsIdentity' avant de l'utiliser.

Le constructeur est:

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

pour une classe définie comme:

public class Identity : WindowsIdentity 

Ma question est, comment puis-je valider le paramètre WindowsIdentity? Devrais-je le valider dans le constructeur, et lancer une exception, ou y a-t-il une meilleure façon de l'appeler?

Répondre

12

Vous pouvez valider dans une méthode statique:

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

static Token GetToken(WindowsIdentity ident) 
{ 
    if(ident == null) 
     throw new ArgumentNullException("ident"); 

    return ident.Token; 
} 

(je n'ai pas pris la peine de chercher le type de WindowsIdentity.Token, mais vous voyez l'idée)

2

Je crois que FXCop signale cette erreur ici car il pense que vous pourriez rencontrer une exception NullReferenceException en accédant à windowsIdentity lors de l'appel du constructeur de classe de base.

Une façon d'ajouter un contrôle de validation nul serait d'ajouter une fonction privée statique à votre classe qui peut vérifier le paramètre WindowsIdentity pour nul et prendre les mesures appropriées:

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(); 
} 

Une autre approche serait de utiliser l'opérateur ternaire pour vérifier le paramètre, comme dans:

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

Mais, ce que vous devez vraiment vous demander est ce que feriez-vous? Si vous allez simplement lancer une exception, il peut être correct de laisser le code tel quel, car il le sera déjà via un NullReferenceException si l'argument est nul.

1

Il se plaint parce que si vous passez NULL comme windowsIdentity, alors quand le constructeur enchaîne à la classe de base, il lancera une exception de référence nulle.

La meilleure façon de gérer cela dépend de votre conception. Vous pouvez le vérifier pour null comme ceci:

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

Ou vous pouvez faire un autre constructeur dans le constructeur de classe de base qui prend un WindowsIdentity comme paramètre, et ce constructeur ont fait partie de la validation. Fondamentalement, il existe des tonnes de façons de faire face, il suffit d'utiliser ce qui fonctionne le mieux dans votre situation.

0

flic FX est dit vous que le paramètre ne peut pas être nul, donc si vous en avez vraiment besoin, vous devriez le valider d'une manière ou d'une autre. Puisque vous l'utilisez dans le constructeur, vous voulez probablement une valeur différente de null, vous devriez donc le valider ici pour que FX cop stop vous ennuie ..

Si vous avez besoin d'un constructeur avec null, vous devriez en avoir un autre constructeur sans paramètres.

Si vous ne l'utilisez pas ou si vous le validez sur un autre point, vous pouvez ignorer l'alerte.

Pour éviter le problème avec FXcop, vous devriez lancer ArgumentNullException.

Questions connexes