我是否应该添加带有ReSharper [NotNull]批注的显式null检查?

Tho*_*kow 5 c# resharper null annotations

我正在使用[NotNull]像这样的ReSharpers 注释:

public void MyMethod([NotNull] string a)
{
    if(a == null) // Warning: Expression is always false.
    {
        throw new ArgumentNullException();
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,由于有NotNull注释,ReSharper会警告我有关未使用的前提条件检查的信息,因为

表达总是假的

但是,据我了解,这些注释仅表示该参数永远不应为null;即,它们不禁止呼叫者通过null,例如

this.MyMethod(null);
Run Code Online (Sandbox Code Playgroud)

甚至不那么明显(更像真实代码)

string foo = null;
this.MyMethod(foo);
Run Code Online (Sandbox Code Playgroud)

因此,我认为包括对的前提条件检查确实是有道理的null,但是也许我错过了一个概念或对它的理解不正确。


为带[NotNull]注释的参数包括显式的可空性检查是否有意义?

All*_*len 3

我测试了这个,当你标记一个参数时,[NotNull]基本上告诉你这个参数不应该采用空字符串。传递空值时,您会收到来自 Resharper 的警告,告诉您“标有 [NotNull] 属性的实体可能存在空赋值。”,但您没有收到错误,因此程序可以编译。明智的做法是防止正在调用的方法中出现空值。

  • 是的,这正是重点,它告诉调用者参数**不应该**不为“null”,但它不会**强制**参数永远不会为“null”。我会听从你的建议并防止“null”参数。 (2认同)