C#6语法小计

165 阅读2分钟

Null 条件运算符

Null 条件运算符使 null 检查更轻松、更流畅 。 将成员访问 . 替换为 ?.:

C#复制

var first = person?.FirstName; 

在前面的示例中,如果 Person 对象是 null,则将变量 first 赋值为 null。 否则,将 FirstName 属性的值分配给该变量。 最重要的是,?. 意味着当 person 变量为 null 时,此行代码不会生成 NullReferenceException。 它会短路并返回 null。 还可以将 null 条件运算符用于数组或索引器访问。 将索引表达式中的 [] 替换为 ?[]。

无论 person 的值是什么,以下表达式均返回 string。 通常,将此构造与“null 合并”运算符一起使用,以在其中一个属性为 null 时分配默认值 。 表达式短路时,键入返回的 null 值以匹配整个表达式。

C#复制

first = person?.FirstName ?? "Unspecified";

还可以将 ?. 用于有条件地调用方法。 具有 null 条件运算符的成员函数的最常见用法是用于安全地调用可能为 null 的委托(或事件处理程序)。 通过使用 ?. 运算符调用该委托的 Invoke 方法来访问成员。 可以在委托模式一文中看到示例。

?. 运算符的规则确保运算符的左侧仅计算一次。 它支持许多语法,包括使用事件处理程序的以下示例:

C#复制

// preferred in C# 6:
this.SomethingHappened?.Invoke(this, eventArgs);

确保左侧只计算一次,这使得你可以在 ?. 的左侧使用任何表达式(包括方法调用)

字符串内插

使用 C# 6,新的字符串内插功能可以在字符串中嵌入表达式。 使用 $ 作为字符串的开头,并使用 {和 } 之间的表达式代替序号:

C#复制

public string FullName => $"{FirstName} {LastName}";

本示例使用替代表达式的属性。 可以使用任何表达式。 例如,可以在内插过程中计算学生的成绩平均值:

C#复制

public string GetGradePointPercentage() =>
    $"Name: {LastName}, {FirstName}. G.P.A: {Grades.Average():F2}";

上一行代码将 Grades.Average() 的值格式设置为具有两位小数的浮点数。

Expression-bodied 函数成员

你编写的许多成员是可以作为单个表达式的单个语句。 改为编写 expression-bodied 成员。 这适用于方法和只读属性。 例如,重写 ToString() 通常是理想之选:

C#复制

public override string ToString() => $"{LastName}, {FirstName}";

也可以将此语法用于只读属性:

C#复制

public string FullName => $"{FirstName} {LastName}";

将现有成员更改为 expression bodied 成员是二进制兼容的更改。