看来NotNull
和 ContractAnnotation("key: null => halt")
它们对 R# 的影响非常相似。有什么我想念的吗?我应该总是同时申请吗?
最佳答案
它们非常相似,但在语义上非常不同。NotNull
声明目标不为空,但没有说明后果。可能有一个空检查会抛出 ArgumentNullException
,或者它可能不检查就直接使用它,并且您可以获得运行时 NullReferenceException
.同样,应用程序可能会检查 null,记录它并安全地继续。ContractAnnotation("key: null => halt")
告诉 ReSharper 如果 key
参数为空,则程序流程终止。 ReSharper 可以像这样使用它:
string foo = null;
Assert.NotNull(foo); // ContractAnnotation("null => halt")
Assert.Equal(12, foo.length);
此代码段中的第二个断言将被标记为死代码,因为 ReSharper 知道第一个断言在传递空值时会抛出。
但是,如果
Assert.NotNull
刚刚标有 NotNull
属性,然后 ReSharper 将突出显示 foo
带有警告的参数,告诉您不应传递空值,但它不知道如果这样做会发生什么。微妙,但不同。我会坚持使用
NotNull
属性,如果您要求值永远不会为空,请使用 ContractAnnotation("null => halt")
对于断言样式方法,如果传递空值,该方法肯定会显式抛出。
关于null - 我应该同时使用 NotNull 和 ContractAnnotation ("null => halt")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23984569/