在我们的代码库中,我们有一组自定义错误检查函数(如列出的 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 属性、ContractAnnotation
、NotNull
和 InvokerParameterName
来装饰它,如下所示:
[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/