null - 我应该同时使用 NotNull 和 ContractAnnotation ("null => halt")?

标签 null resharper static-analysis design-by-contract

看来NotNullContractAnnotation("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/

相关文章:

lua静态分析: detecting uninitialized table field

c - 当你声明一个指针时,它是 NULL 吗?

c# - 运行涵盖此方法/类的所有测试

java - 处理具有高圈复杂度的 if/switch 语句的代码的最佳方法是什么?

visual-studio - 在 Visual Studio 或 ReSharper 中提取局部变量的快捷方式(对于 C#)

xaml - ElementName 绑定(bind)不解析属性

c++ - 静态代码分析器 : unmanaged C++ Visual Studio 2008

MySQL:使用随机日期或空值填充表

ios - CLLocationCooperative2D 被传递后得到奇怪的值

ruby-on-rails - Rails 4.0 未定义方法 `+' 为 nil :NilClass