申请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”警告的原因。用于定义合约注解的语言在here 进行了解释。
第二个是 [NotNull],告诉 ReSharper parameter 不能试探性地为空。这会给出“可能对标有 [NotNull] 属性的实体进行空分配”警告。
第三个,[InvokerParameterName] 告诉 ReSharper parameterName 参数是来自调用(调用)方法的参数之一的名称,因此它将提供列出所有调用方法参数的代码完成。如果名称不是参数(例如,局部变量名称),这将在 ReSharper 中发出警告。
以下是这些属性的实际操作短视频(应用于另一组 API,但思路完全相同):http://screencast.com/t/NhGVaUr7GO3b