10

在 VS2010 beta(以前版本的 FxCop)中运行代码分析后,我收到以下警告:

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

构造函数是:

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

对于定义为的类:

public class Identity : WindowsIdentity

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

4

5 回答 5

13

您可以在静态方法中验证它:

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 的类型,但你明白了)

于 2009-12-17T19:18:38.650 回答
2

从 C# 6.0 开始,您可以将空合并运算符空条件运算符结合使用,如下所示:

public Identity(WindowsIdentity winIdentity)
    : base(winIdentity?.Token ?? throw new ArgumentNullException(nameof(winIdentity)))
{
    init();
}
于 2017-11-14T10:31:22.543 回答
1

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

为 null 添加验证检查的一种方法是向您的类添加一个静态私有函数,该函数可以检查 WindowsIdentity 参数是否为 null 并采取适当的操作:

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如果参数为空,它已经通过 a 。

于 2009-12-17T19:16:15.443 回答
1

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

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

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

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

于 2009-12-17T19:16:36.070 回答
0

FX cop 告诉你参数不能为空,所以如果你真的需要它,你应该以某种方式验证它。由于您在构造函数中使用它,因此您可能想要一个与 null 不同的值,因此您应该在那里验证它,以防 FX cop 不再打扰您。

如果你需要一个带有 null 的构造函数,你应该有另一个没有参数的构造函数。

如果您不使用它或者您正在另一点验证它,您可以跳过警报。

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

于 2009-12-17T19:21:10.773 回答