2009-12-17 78 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。