C# 7.0 核心技术指南 (47):C#语言基础 2.10.2

阅读数:7 2019 年 12 月 4 日 17:11

C# 7.0核心技术指南(47):C#语言基础 2.10.2

(null 条件运算符(C# 6))

内容简介
本书前三章将集中介绍 C#语言。首先介绍基本的语法、类型和变量。而后会介绍一些高级的特性,如不安全代码以及预处理指令。如果你是 C#语言的初学者,请循序渐进地阅读这些章节。
其余各章则涵盖了.NET Framework 的核心功能,包括 LINQ、XML、集合、并发、I/O 和网络、内存管理、反射、动态编程、特性、安全、应用程序域和原生互操作性等主题。第 6 章和第 7 章是后续主题的基础,除这两章之外,其余各章可以按照需要以任何顺序阅读。LINQ 相关的三个章节好按顺序阅读。其中的一些章节需要一些并发相关的知识,这些知识将在第 14 章中介绍。

C# 6 中引入了“?.”运算符,称为 null 条件运算符或者 Elvis 运算符(从 Elvis 表情符号而来)。该运算符可以像标准的“.”运算符那样访问成员以及调用方法。当运算符的左侧为 null 的时候,该表达式的运算结果也是 null 而不会抛出 NullReferenceException 异常。

复制代码
System.Text.StringBuilder sb = null;
string s = sb?.ToString(); // No error; s instead evaluates to null

上述代码的最后一行等价于:

复制代码
string s = (sb == null ? null : sb.ToString());

当遇到 null 时,Elvis 运算符将直接略过表达式的其余部分。在接下来的例子中,即使 ToString() 和 ToUpper() 方法使用的是标准的. 运算符,s 的值仍然为 null。

复制代码
System.Text.StringBuilder sb = null;
string s = sb?.ToString().ToUpper(); // s evaluates to null without error

仅当直接的左侧运算数有可能为 null 的时候才有必要重复使用 Elvis 运算符。因此下述表达式在 x 和 y 都为 null 时依然是健壮的:

复制代码
x?.y?.z

它等价于(唯一的不同在于 x.y 仅执行了一次):

复制代码
x == null ? null
: (x.y == null ? null : x.y.z)

需要指出,最终的表达式必须能够处理 null,因此下面的范例是不合法的:

复制代码
System.Text.StringBuilder sb = null;
int length = sb?.ToString().Length; // Illegal : int cannot be null

我们可以使用可空类型(请参见 4.7 节)来修正这个问题。例如:

复制代码
int? length = sb?.ToString().Length; // OK : int? can be null

我们也可以使用 null 条件运算符调用返回值为 void 的方法:

复制代码
someObject?.SomeVoidMethod();

如果 someObject 为 null,则表达式将“不执行指令”而不会抛出 NullReference-Exception 异常。

null 条件运算符可以和第 3 章介绍的常用类型成员一起使用,包括方法、字段、属性和索引器。而且它也可以和 null 合并运算符配合使用。

复制代码
System.Text.StringBuilder sb = null;
string s = sb?.ToString() ?? "nothing"; // s evaluates to "nothing"

C# 7.0核心技术指南(47):C#语言基础 2.10.2

购书地址 https://item.jd.com/12681788.html?dist=jd

评论

发布