本文主要是介绍C# 8.0 的可空引用类型,不止是加个问号哦!你还有很多种不同的可空玩法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
C# 8.0 引入了可空引用类型,你可以通过 ?
为字段、属性、方法参数、返回值等添加是否可为 null 的特性。
但是如果你真的在把你原有的旧项目迁移到可空类型的时候,你就会发现情况远比你想象当中复杂,因为你写的代码可能只在部分情况下可空,部分情况下不可空;或者传入空时才可为空,传入非空时则不可为空。
本文内容
- C# 8.0 可空特性
- 更灵活控制的可空特性
- 输入:`AllowNull`
- 输入:`DisallowNull`
- 输出:`MaybeNull`
- 输出:`NotNull`
- `NotNullWhen`, `MaybeNullWhen`
- `NotNullIfNotNull`
- 在早期 .NET Framework 或者早期版本的 .NET Core 中使用
- Walterlv.NullableAttributes
C# 8.0 可空特性
在开始迁移你的项目之前,你可能需要了解如何开启项目的可空类型支持:
- C# 8.0 如何在项目中开启可空引用类型的支持 - walterlv
可空引用类型是 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 时某个
这篇关于C# 8.0 的可空引用类型,不止是加个问号哦!你还有很多种不同的可空玩法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!