2009-12-17 54 views
8

運行代碼分析在VS2010測試版(的FxCop對於以前的版本)我得到以下警告後:驗證C#基類的構造函數的參數

在外部可見的方法 「Identity.Identity(的WindowsIdentity)」, 在使用之前驗證參數'windowsIdentity' 。

的構造是:

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

一類定義爲:

public class Identity : WindowsIdentity 

我的問題是,我該如何驗證的WindowsIdentity參數?我應該在構造函數中驗證它並拋出一個異常,還是有更好的方法來調用它?

回答

12

您可以驗證它的靜態方法:

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

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

    return ident.Token; 
} 

(我沒有刻意去尋找WindowsIdentity.Token的類型,但你的想法)

2

我相信FXCop在這裏報告這個錯誤,因爲它認爲你在調用基類構造函數時可能遇到一個NullReferenceException,它通過訪問windowsIdentity。增加對空驗證檢查

一種方法是一個靜態的私有函數添加到您的類,它可以檢查空了的WindowsIdentity參數,並採取適當的行動:

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

另一種方法是使用三元運算符來驗證參數,如下:

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

但是,你應該真正問自己的是你會做什麼?如果你只是拋出一個異常,讓代碼保持原樣就可以了,因爲如果參數爲null,它已經通過NullReferenceException

1

這是抱怨,因爲如果你傳遞NULL作爲windowsIdentity,那麼當構造函數鏈接到基類時,它將拋出一個空引用異常。

最好的處理方法取決於你的設計。 你可以檢查它的空是這樣的:

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

或者你可以使基類構造另一個構造函數一個的WindowsIdentity作爲參數,並且具有構造做驗證的一部分。基本上有很多方法來處理它,只是使用你的情況下最好的方法。

0

FX警察告訴你該參數不能爲空,所以如果你真的需要它,你應該以某種方式驗證它。因爲你在構造函數中使用它,所以你可能想要一個不同於null的值,所以你應該在那裏驗證它是否爲FX警察停止討厭你..

如果你需要一個帶有null的構造函數,你應該有另一個沒有參數的構造函數。

如果您不使用它或者您正在另一個點進行驗證,則可以跳過該警報。

爲了避免FXcop的問題,您應該拋出ArgumentNullException。