C# 8.0 引入了可空引用类型,你可以通过 ?
为字段、属性、方法参数、返回值等添加是否可为 null 的特性。
但是如果你真的在把你原有的旧项目迁移到可空类型的时候,你就会发现情况远比你想象当中复杂,因为你写的代码可能只在部分情况下可空,部分情况下不可空;或者传入空时才可为空,传入非空时则不可为空。
在开始迁移你的项目之前,你可能需要了解如何开启项目的可空类型支持:
可空引用类型是 C# 8.0 带来的新特性。
你可能会好奇,C# 语言的可空特性为什么在编译成类库之后,依然可以被引用它的程序集识别。也许你可以理解为有什么特性 Attribute
标记了字段、属性、方法参数、返回值的可空特性,于是可空特性就被编译到程序集中了。
确实,可空特性是通过 NullableAttribute
和 NullableContextAttribute
这两个特性标记的。
但你是否好奇,即使在古老的 .NET Framework 4.5 或者 .NET Standard 2.0 中开发的时候,你也可以编译出支持可空信息的程序集出来。这些古老的框架中没有这些新出来的类型,为什么也可以携带类型的可空特性呢?
实际上反编译一下编译出来的程序集就能立刻看到结果了。
看下图,在早期版本的 .NET 框架中,可空特性实际上是被编译到程序集里面,作为 internal
的 Attribute
类型了。
所以,放心使用可空类型吧!旧版本的框架也是可以用的。
阻碍你将老项目迁移到可空类型的原因,可能还有你原来代码逻辑的问题。因为有些情况下你无法完完全全将类型迁移到可空。
例如:
null
或者获取可空类型时你能确保此时一定不为 null
(待会儿我会解释到底是什么情况);null
那种情况下返回的是非 null
;null
的时候才返回 null
,传入非 null
的时候返回非 null
。为了解决这些情况,C# 8.0 还同时引入了下面这些 Attribute
:
AllowNull
: 标记一个不可空的输入实际上是可以传入 null 的。DisallowNull
: 标记一个可空的输入实际上不应该传入 null。MaybeNull
: 标记一个非空的返回值实际上可能会返回 null,返回值包括输出参数。NotNull
: 标记一个可空的返回值实际上是不可能为 null 的。MaybeNullWhen
: 当返回指定的 true/false 时某个本文发布于:2024-02-02 02:54:45,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170681568240936.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |