27

C# 8小特性

 5 years ago
source link: http://www.infoq.com/cn/news/2018/09/csharp-8-small-features?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

对于C# 8,有吸引了大多数注意力的重大特性,如默认接口方法和可空引用,也有许多小特性被考虑在内。本文将介绍几例可能加入C#未来版本的小特性。

新的赋值运算符:&&=和||=

从第一个版本开始,C#就支持把等号和另外一种运算符合在一起的语法。这几乎包括除短路布尔运算符&&和||之外的所有的二元操作符(如+、-、&等)。“ 赋值运算符&&=和||= ”提案是对这个列表的补充。

逐字内插字符串

逐字字符串以@"开头。内插字符串使用$"。但是,如果你想要一个既逐字又内插的字符串呢?是用@$"还是$@"?目前,其中一个有效,另一个会报编译器错误,但是,人们通常很难记住哪个是哪个。

在一个名为“ 逐字插入字符串 ”的中肯提案中,该语法将得到扩展,接受@$"。对它的解释将和逐字插入字符串($@")完全相同,因此,你再也不用担心弄反了。

关于这项修改,存在一些小争议,因为有人认为这没有必要或者会导致不一致。

允许using语句结构匹配IDisposable

接口与C#编译器之间存在着奇怪的关系。经常,你不必为了使用一个语言特性而真正实现一个具体的抽象接口;你只需在类似抽象接口的类上创建一个公开的API。

典型的例子是“foreach”和IEnumerable。如果类有一个方法GetEnumerator,返回一个包含Current属性和MoveNext方法的对象,那么你就可以使用foreach。实际的返回类型不重要,这使得 List<T>这样的类似可以实现更快速的枚举器 。这通常称为“结构匹配(structural matching)”。

在这个提案中, using语句也将支持结构匹配 。这乍看之下没什么用,因为你不会希望看到一个可释放类没有实现IDisposable。不过,有一种名为 ref struct 的新类型。它们不能实现接口,因此,如果没有这项提案,你在使用它们时就无法使用using语句。

和foreach与using共用的扩展方法

这个提案是前述提案的补充,是为了能够把GetEnumerator或Dispose作为扩展方法添加,并且可以分别和“foreach”或“using”共用。再次,我们谈论的这项特性仅用于非常特殊的情况。例如,你可以从第三方库(这可能是调用Marshal.ReleaseComObject的好地方)向一个COM对象添加一个Dispose扩展方法。

这还不是一个正式的提案,可能会合并到前面提到的“using”语句修改中。

“using”语句隐式作用域

目前,“using”语句后面只能是一个显式作用域(即一对花括号)或者另一个“using”语句。如果这个 提案 通过,你就可以编写下面这样的代码:

using var a = new MyDisposable();
using var b = new MyDisposable();
using var c = new MyDisposable();

上述每个变量都会在当前作用域结束时以相反的顺序自动释放。从功能上说,这和下面的代码等价,但更简洁,也不会引入新作用域。

using (var a = new MyDisposable())
using (var b = new MyDisposable())
using (var c = new MyDisposable())
{
    // 一些代码
}

当需要多个可释放对象而又不同时创建时,这项修改会特别有用。你甚至可以在表达式中间创建可释放对象,而且可以确信,它将在当前作用域结束时释放。

var results = myExcelReader.ReadResults(using new MyExcelSheet(excelFilePath));

对于这项提案,其中一个批评是,它与某些语句如“goto”不兼容。

查看英文原文: C# 8 Small Features


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK