在我们的代码库中,我们有一组自定义错误检查功能(如列出的here),以便更简洁地检查参数。例如,要检查null的参数,我使用:
Throw.IfNull(theArgument, "theArgument");
这种方法的一个缺点是R#在将来使用该值时会发出警告“可能的NullReferenceException”,因为它不够聪明,无法将此检测为空检查(或者如果该参数为null,则至少会失败) )。有没有办法表明此方法检查参数为null?例如,当我尝试在这样的值上运行像Select()这样的静态扩展时,R#警告我'可能为使用NotNull属性标记的实体进行空赋值',但我找不到任何这种属性的文档,也没有在Enumerable.Select()的参考源中看到它。
答案 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属性装饰它,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,则此方法将暂停程序执行,即抛出异常(在运行时)。这是阻止&#34;可能的NullReferenceException&#34;警告。用于定义合同注释的语言解释为here。
第二个是[NotNull]
,告诉ReSharper parameter
一定不能启发式地为空。这给了标记有[NotNull]属性的实体&#34;可能的空赋值&#34;警告。
第三个,[InvokerParameterName]
告诉ReSharper parameterName
参数是调用(调用)方法中的一个参数的名称,因此它将提供列出所有调用方法的代码完成参数。如果名称不是参数,这将在ReSharper中发出警告,例如,本地变量名称。
这是一个关于这些属性的简短视频(适用于另一组API,但想法完全相同):http://screencast.com/t/NhGVaUr7GO3b