2009-12-17 15 views
8

Dopo l'esecuzione di analisi del codice a VS2010 beta (FxCop per le versioni precedenti) sto ottenendo il seguente avviso:Convalida C# base di parametri costruttore di classe

Nel metodo visibile esternamente 'Identity.Identity (WindowsIdentity)', convalidare il parametro 'windowsIdentity' prima di utilizzarlo.

Il costruttore è:

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

per una classe definita come:

public class Identity : WindowsIdentity 

La mia domanda è: come faccio a convalidare il parametro WindowsIdentity? Devo convalidarlo nel costruttore e lanciare un'eccezione, o c'è un modo migliore per chiamare questo?

risposta

12

è possibile convalidare in un metodo statico:

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

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

    return ident.Token; 
} 

(non mi sono preoccupato di cercare il tipo di WindowsIdentity.Token, ma si ottiene l'idea)

2

Credo che FXCop riporti questo errore qui perché pensa che si possa incontrare una NullReferenceException accedendo a windowsIdentity quando si chiama il costruttore della classe base.

Un modo per aggiungere un controllo di convalida per nulla potrebbe essere quella di aggiungere una funzione privata statica alla classe che che può controllare il parametro WindowsIdentity per nulla e prendere i provvedimenti opportuni:

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

Un altro approccio sarebbe quello di utilizzare l'operatore ternario per verificare il parametro, come in:

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

Ma, che cosa si dovrebbe davvero porsi è cosa vorresti fare? Se stai semplicemente andando a gettare un'eccezione, potrebbe essere ok lasciare che il codice si trovi così com'è, dato che sarà già attraverso un NullReferenceException se l'argomento è nullo.

1

Si lamenta perché se si passa NULL come WindowsIdentity, quindi quando il costruttore si incatena alla classe base, genererà un'eccezione di riferimento null.

Il modo migliore per gestirlo dipende dal modello. Si potrebbe verificare per nulla in questo modo:

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

Oppure si potrebbe fare un altro costruttore nel costruttore della classe base che prende un WindowsIdentity come parametro, e che hanno costruttore di fare quella parte della convalida. Fondamentalmente ci sono molti modi per affrontarlo, basta usare ciò che funziona meglio nella tua situazione.

0

FX poliziotto è raccontare tu che il parametro non può essere nullo, quindi se ne hai davvero bisogno dovresti validarlo in qualche modo. Dal momento che lo stai usando nel costruttore, probabilmente vuoi un valore diverso da null, quindi dovresti convalidarlo lì per FX poliziotto smettila di infastidirti ..

Se hai bisogno di un costruttore con null, dovresti avere un altro costruttore senza parametri.

Se non lo si utilizza o lo si sta convalidando in un altro punto, è possibile saltare l'avviso.

Per evitare il problema con FXcop, è necessario lanciare ArgumentNullException.

1

Come di C# 6.0 è possibile utilizzare null-coalescing operator combinata con la null-conditional operator in questo modo:

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