C# 7.1 中的新增功能
官方文档见 这里。本文在其基础上添加了一些自己理解及示例代码,如有不正确的地方欢迎指正。
异步 main 方法
之前如果需要在 Main 方法中调用异步方法,需要使用如下方式调用。
static void Main(string[] args)
{
var result = Task1().GetAwaiter().GetResult();
Console.WriteLine($"Async task result : {result}");
}
static async Task<int> Task1()
{
await Task2();
return await Task.FromResult(1);
}
static async Task<int> Task2()
{
return await Task.FromResult(2);
}
现在,可以在 Main 方法中使用 await
关键字:
static async Task Main(string[] args)
{
var result = await Task1();
Console.WriteLine($"Async task result : {result}");
}
static async Task<int> Task1()
{
await Task2();
return await Task.FromResult(1);
}
static async Task<int> Task2()
{
return await Task.FromResult(2);
}
默认文本表达式
默认文本表达式是针对默认值表达式的一项增强功能。这些表达式将变量初始化为默认值。过去会这么编写:
Func<string, bool> whereClause = default(Func<string, bool>);
现在,可以省略掉初始化右侧的类型:
Func<string, bool> whereClause = default;
推断元组元素名称
此功能是对 C# 7.0 中引入的元组功能一次小型增强。在初始化元组时,许多时候,赋值操作右侧的变量名与用于元组元素的名称相同:
int count = 5;
string label = "Colors used in the map";
var pair = (count: count, label: label);
元组元素的名称可通过在 C# 7.1 中初始化元组时使用的变量进行推断:
int count = 5;
string label = "Colors used in the map";
var pair = (count, label); // element names are "count" and "label"
这又是一个语法糖。不过使用的时候要注意,修改变量名时,元组元素使用的地方并不会自动修改,而是调用的地方会被红框框起来,且编辑器右上角会有 1 个无法解决的冲突 的提示。
泛型类型参数的模式匹配
自 C# 7.1 起, is
和 switch
类型模式的模式表达式的类型可能为 泛型类型参数 。这可能在检查 struct
或 class
类型且要避免装箱时最有用。
void M<T1, T2>(T1 t1, T2 t2)
{
switch (t2)
{
case T1 _:
break;
case T2 _:
break;
default:
break;
}
}
上述代码在 C# 7.1 中可以正常运行,在 C# 7.0 中 case T1 _:
这行代码会显示如下错误:
在 C# 7.0 中,“T1”类型的模式无法处理“T2”类型的表达式。请使用语言版本 7.1 或更高版本。
引用程序集生成
有两个新编译器选项可生成仅引用程序集:-refout
和 -refonly
。
使用 -refonly
参数将只生成 引用程序集。此选项对应于 MSBuild 的 ProduceOnlyReferenceAssembly 项目属性。
csc -refonly -target:library Class1.cs
这时仅生成 Class1.dll 文件,而且是 引用程序集。
使用 -refout
参数时需通过 -refout:filepath
的格式指定 引用程序集 的输出路径。此选项对应于 MSBuild 的 ProduceReferenceAssembly 项目属性。
csc -refout:ref\Class1Ref.dll -target:library Class1.cs
会生成 Class1.dll 和 ref 目录下的 Class1Ref.dll 文件,其中 Class1.dll 文件是 实现程序集, Class1Ref.dll 文件是 引用程序集。
关于为何要使用引用程序集以及如何使用可以参考 这篇文档 。