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

标签 c# visual-studio-2012 resharper

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

Throw.IfNull(theArgument, "theArgument");

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

最佳答案

你问的问题绝对可以通过应用 ReSharper Annotations 来解决!这些是为 ReSharper 的分析提供额外提示的属性,允许您将 ReSharper“优点”添加到您自己的方法和类中。我最近用 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,则此方法会停止程序执行,即抛出异常(在运行时)。这就是防止“可能的 NullReferenceException”警告的原因。解释了用于定义契约(Contract)注释的语言 here .

第二个是 [NotNull],告诉 ReSharper parameter 不能启发式地为 null。这会给出“可能对标有 [NotNull] 属性的实体进行空赋值”警告。

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

下面是这些属性的简短视频(应用于另一组 API,但原理完全相同):http://screencast.com/t/NhGVaUr7GO3b

关于c# - 如何向 R# 指示函数检查变量是否为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22360941/

相关文章:

c# - 在 Winforms 应用程序中筛选 ReportViewer

c++ - 在不同的类上调用不同的成员函数

sql - VS2012 部署后脚本引用了其他几个脚本

debugging - Visual Studio 2010 调试器找到在快捷键处停止的转到当前行

c# - 选择具有特定值的节点

c# - 如何对文件中的 xml 节点进行排序?

c# - 动态过滤linq lambda表达式

c# - 如何将 Metro App 部署到桌面?

unit-testing - 使用Resharper和Phantom JS调试 Jasmine 测试

resharper - 我可以让 R# 智能感知选择第一个列表项吗?