验证C#基类构造函数参数

10

在VS2010 beta中运行代码分析(对于之前的版本来说是FxCop)后,我收到了以下警告:

在外部可见方法“Identity.Identity(WindowsIdentity)”中,在使用参数“windowsIdentity”之前请进行验证。

构造函数为:

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

对于以下定义的类:

public class Identity : WindowsIdentity

我的问题是,如何验证windowsIdentity参数?我应该在构造函数中验证它并抛出异常,还是有更好的方法调用它?

5个回答

15

您可以在静态方法中对其进行验证:

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的类型,但你可以理解这个想法)


4

如果Token为null,这也会抛出异常,此时参数的名称是误导性的。 - Doug Domeny

1

我相信FXCop在这里报告了这个错误,因为它认为在调用基类构造函数时访问windowsIdentity可能会遇到NullReferenceException。

添加一个用于检查null的静态私有函数到你的类中是一种验证方法,该函数可以检查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();
}

但是,你真正应该问自己的是你会怎么做?如果你只想要抛出一个异常,那么让代码保持原样可能还可以,因为如果参数为空,它已经会抛出一个NullReferenceException了。


3
ArgumentNullException 是合约不匹配。NullReferenceException 是运行时错误。 - Rodrigo Rodrigues

1

它会抱怨,因为如果您将NULL作为windowsIdentity传递,则当构造函数链接到基类时,它将引发空引用异常。

最好的处理方法取决于您的设计。您可以像这样检查它是否为空:

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

或者你可以在基类构造函数中创建另一个构造函数,该构造函数以WindowsIdentity作为参数,并让该构造函数执行验证的部分。基本上有很多方法来处理它,只需使用在您的情况下最有效的方法即可。

0

FX Cop 提醒您参数不能为空,因此如果您确实需要它,应该以某种方式进行验证。由于您在构造函数中使用它,您可能希望有一个与 null 不同的值,因此您应该在那里对其进行验证,以避免 FX Cop 继续打扰您。

如果您需要一个具有 null 值的构造函数,则应该再添加一个没有参数的构造函数。

如果您没有使用它或者在其他地方进行了验证,则可以跳过警告。

为避免 FXcop 的问题,您应该抛出 ArgumentNullException 异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接