如何向R#指示函数检查变量是否为null

时间:2014-03-12 18:41:28

标签: c# visual-studio-2012 resharper

在我们的代码库中,我们有一组自定义错误检查功能(如列出的here),以便更简洁地检查参数。例如,要检查null的参数,我使用:

Throw.IfNull(theArgument, "theArgument");

这种方法的一个缺点是R#在将来使用该值时会发出警告“可能的NullReferenceException”,因为它不够聪明,无法将此检测为空检查(或者如果该参数为null,则至少会失败) )。有没有办法表明此方法检查参数为null?例如,当我尝试在这样的值上运行像Select()这样的静态扩展时,R#警告我'可能为使用NotNull属性标记的实体进行空赋值',但我找不到任何这种属性的文档,也没有在Enumerable.Select()的参考源中看到它。

1 个答案:

答案 0 :(得分:13)

应用ReSharper Annotations绝对可以解决您的问题!这些属性为ReSharper的分析提供了额外的提示,允许您添加ReSharper" goodness"到你自己的方法和类。我最近在JetBrains上录制了一个名为ReSharper Secrets的网络研讨会,在那里我谈论和演示注释,欢迎你观看它!

关于您的问题,您可以应用3个注释属性来解决问题(并添加更多很酷的功能)。

假设IfNull的定义类似于:

public static class Throw
{
    public static void IfNull<T>(T parameter, string parameterName) where T : class
    {
        if (parameter == null) 
            throw ArgumentNullException(string.Format("Parameter {0} is null", parameterName));
    }
}

您可以使用3个ReSharper属性装饰它,ContractAnnotationNotNullInvokerParameterName,如下所示:

[ContractAnnotation("parameter: null => halt")]
public static void IfNull<T>([NotNull] T parameter,
                             [InvokerParameterName] string parameterName) 
    where T : class
{
    ...
}

以下是这些属性的作用:

第一个[ContractAnnotation]告诉ReSharper,如果parameter启发式为null,则此方法将暂停程序执行,即抛出异常(在运行时)。这是阻止&#34;可能的NullReferenceException&#34;警告。用于定义合同注释的语言解释为here

第二个是[NotNull],告诉ReSharper parameter一定不能启发式地为空。这给了标记有[NotNull]属性的实体&#34;可能的空赋值&#34;警告。

第三个,[InvokerParameterName]告诉ReSharper parameterName参数是调用(调用)方法中的一个参数的名称,因此它将提供列出所有调用方法的代码完成参数。如果名称不是参数,这将在ReSharper中发出警告,例如,本地变量名称。

这是一个关于这些属性的简短视频(适用于另一组API,但想法完全相同):http://screencast.com/t/NhGVaUr7GO3b