c#-8.0 - 有什么理由不总是使用 C# 8.0 的不可空引用类型吗?

标签 c#-8.0 non-nullable

上下文

C# 8.0 具有 non-nullable reference types 的这个特性.

string notNull = "Hello";
string? nullable = default;
notNull = nullable!; // null forgiveness

问题

始终在 *.csproj 文件中启用不可为空性的原因是什么?

你有 list 吗?比如,“不要 <Nullable>enable</Nullable> 如果...a)...b)...c)...”?

我能想到的

我能想到的唯一原因是与现有代码的向后兼容性。意思是:启用该功能并修复所有编译器错误和调整代码可能太耗时,因此成本高昂;也许也容易出错。

我用谷歌搜索但没有找到任何其他原因:when not to use non-nullable refernce types in c# - Google Search

文档

附言

请告诉我 Stack Overflow 是否是提出此问题的错误地点,以及哪个其他 Stack Exchange 网站更适合。

我认为 Stack Exchange 可能是正确的位置,因为 What topics can I ask about here?

  • “软件开发所特有的实际的、可回答的问题”

最佳答案

这是因为语义空检查器没有(也不能)涵盖所有条件来断言变量已从非空值分配,并且需要许多额外的标记来帮助空检查器,如系列的属性,甚至不足以使一切看起来都正常。

这是一个不完整的列表:

  • 当一个方法的返回值依赖于参数复杂且无法用NotNullWhen系列属性描述时,它应该被标记为可空的,即使它可以被断言不为空。

  • null检查器只能将一个类的构造函数作为唯一的初始化时机,这意味着一些对象(反序列化实体、虚拟actor、razor组件等)的生命周期由一个库拥有和管理/框架应声明为所有字段都标记为可为空,即使假设某些库定义的初始化方法(分配所有必需的非可空值)在任何其他方法之前被调用。

  • 当流检查器无法断言局部变量的可为空状态时,该局部变量被推断为始终可以为空,使用 var 关键字,或者从某些代码返回的值不或者不能准确标记可空性,在使用前强制执行空检查或 ! 将其视为可空,即使程序员清楚地知道它不能为空。

是的,您可以在任何地方使用 ![AllowNull] 系列来禁用空检查器,但为什么不禁用整个空检查机制呢?因此,可空特性将毫无意义。

可空引用类型特性只适用于逻辑非常基础或琐碎的项目。只要花费大于帮助,不启用它就是合理的。

关于c#-8.0 - 有什么理由不总是使用 C# 8.0 的不可空引用类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63092024/

相关文章:

c# - 如果默认接口(interface)方法是在 C# 8.0 中实现的,为什么我还需要抽象类?

c# - 无法将可解构类型隐式转换为元组

string - C#8 nullable : string. IsNullOrEmpty 不被编译器理解为有助于防止空值

flutter - 不可为 null 的实例字段 ['controller' ] 必须在 flutter 中初始化

c# - 不可为空的默认返回空警告

mysql - 为什么 Mysql 允许我插入没有具有 NOT NULL 约束的字段的记录?

c# - 为什么只读成员在结构中而不是在类中

flutter - 声明变量而不初始化它 flutter

java.lang.IllegalArgumentException : Parameter specified as non-null is null error in Java code 异常

c# - 返回 IAsyncEnumerable 的方法是否有明确的命名约定?