关于c#:快速了解C-80中可空引用类型Nullable-reference-type语言特性

53次阅读

共计 2020 个字符,预计需要花费 6 分钟才能阅读完成。

Visual C# 8.0 中引入了可空援用类型(Nullable reference type),通过编译器提供的弱小性能,帮忙开发人员尽可能地躲避由空援用带来的代码问题。这里我大抵介绍一下可空援用类型的根本内容。
刚开始接触这个语言个性的时候,可能会不太容易了解。援用类型原本不就是能够为空(null)的么,为啥还要特地地引入“可空援用类型”的概念呢?其实这是从编译器的角度要求开发人员在编程的时候就思考某个变量是否有可能为空,从而尽可能地缩小由空援用所带来的代码谬误。
假如有如下类:

class Student
{public Student(string name, DateTime dayOfBirth)
        => (Name, DayOfBirth) = (name, dayOfBirth);

    public string Name {get; set;}

    public DateTime DayOfBirth {get; set;}

    public string Notes {get; set;}
}

此类定义了一个“学生”实体的根本信息,为了简化起见,这里只列出了须要探讨的几个属性:

Name:学生姓名
DayOfBirth:学生生日
Notes:对学生信息的一些备注
假如咱们有两个操作:在所有学生中,找出所有具备备注信息的学生,以及对所有学生按姓名排序,在 C# 中很容易应用 Linq 来实现:

var studentsHasNotes = students.Where(s => s.Notes.Length > 0);

以及:

var orderedStudents = students.OrderBy(s => s.Name);

到目前为止没啥问题,程序可能失常运行。然而认真进行代码审查不难发现,在获取所有具备备注信息的学生的代码中(也就是下面第一段代码中),有可能呈现空援用的异样,因为对于一个“学生”实体来说,它的 Notes 属性是有可能为 null 的。
当初咱们关上“可空援用类型”这一语言个性,打开方式次要有两种:能够在我的项目级别,编辑 csproj 我的项目文件进行设置,也能够通过 #nullable 预编译指令来实现:

编辑 csproj 我的项目文件,退出 <Nullable>enable</Nullable> 即可:

通过 #nullable 预编译指令来实现,只须要在代码中须要的中央退出#nullable 指令即可:

启用“可空援用类型”这一语言个性之后你会发现,在下面的 Student 类的构造函数处呈现了一个正告,提醒在构造函数执行实现时,不可为空的“Notes”属性须要有一个不为空的值,倡议将其设置为可空的 string 类型。为什么编译器仅提醒 Notes 有可能为空,而不是 Name 属性呢?因为构造函数中曾经为 Name 赋值了,因而,对于任何一个 Student 的对象,Name 不可能为空,而 Notes 则不然。

Name 不可能为空?它不是 string 类型么?万一在代码中它为空了怎么办?别急,编译器是不会容许呈现这种状况的:

在此,咱们将 Notes 属性设置为 string 类型,于是你会发现,位于构造函数上的正告信息曾经没有了,因为咱们容许 Student 对象能够没有 Notes 数据,但在“找出所有具备备注信息的学生”这一操作时,又会呈现正告,提醒说 Notes 有可能为空:

于是,你会发现,在启用了可空援用类型的语言个性后,咱们就须要认真考查 Student 类型中的每一个援用类型的属性,看它在理论利用中是否有可能为空,如果可能为空,则用可空援用类型来定义属性,之后编译器就会帮忙你来剖析哪些地方有可能存在空援用。

在下面的“找出所有具备备注信息的学生”例子中,如果你感觉 Notes 必定不会为空,那么也能够应用“!”操作符来笼罩编译器的正告信息,比方:

当初风行的.NET 开源框架基本上都曾经反对了可空援用类型了,而且如果你是一名开源框架的开发人员,也强烈建议在你的框架中启用这一语言个性来尽可能地防止空援用问题。比方,如果你在代码中启用了可空援用类型个性,那么当你从 Newtonsoft.Json 的 JsonConverter 类继承时,你会发现,你必须应用可空援用类型的函数重载:

但如果你没有启用可空援用类型个性,那么当你从 Newtonsoft.Json 的 JsonConverter 类继承时,你会发现,重载函数的签名与以前一样:

好了,对于 C# 8.0 的“可空援用类型”大抵就介绍这么多,置信应该曾经基本上概括了它的要点和应用形式,在日常开发中应该够用了。

原文出处:博客园
作者:陈晴阳(dax.net)
原文链接:https://www.cnblogs.com/daxne…

本文转自:SDK 社区(sdk.cn), 是一个中立的社区,这里有多样的前端常识,有丰盛的 api,有爱学习的人工智能开发者,有有趣风趣的开发者带你学 python,还有将来炽热的鸿蒙,当各种元素组合在一起,让咱们一起脑洞大开独特打造业余、好玩、有价值的开发者社区,帮忙开发者实现自我价值!

正文完
 0