Skip to content

C# 7.1 中的新增功能

🏷️ C# C# 新增功能

官方文档见 这里。本文在其基础上添加了一些自己理解及示例代码,如有不正确的地方欢迎指正。

异步 main 方法

之前如果需要在 Main 方法中调用异步方法,需要使用如下方式调用。

csharp
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 关键字:

csharp
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);
}

默认文本表达式

默认文本表达式是针对默认值表达式的一项增强功能。这些表达式将变量初始化为默认值。过去会这么编写:

csharp
Func<string, bool> whereClause = default(Func<string, bool>);

现在,可以省略掉初始化右侧的类型:

csharp
Func<string, bool> whereClause = default;

推断元组元素名称

此功能是对 C# 7.0 中引入的元组功能一次小型增强。在初始化元组时,许多时候,赋值操作右侧的变量名与用于元组元素的名称相同:

csharp
int count = 5;
string label = "Colors used in the map";
var pair = (count: count, label: label);

元组元素的名称可通过在 C# 7.1 中初始化元组时使用的变量进行推断:

csharp
int count = 5;
string label = "Colors used in the map";
var pair = (count, label); // element names are "count" and "label"

这又是一个语法糖。不过使用的时候要注意,修改变量名时,元组元素使用的地方并不会自动修改,而是调用的地方会被红框框起来,且编辑器右上角会有 1 个无法解决的冲突 的提示。


泛型类型参数的模式匹配

自 C# 7.1 起, isswitch 类型模式的模式表达式的类型可能为 泛型类型参数 。这可能在检查 structclass 类型且要避免装箱时最有用。

csharp
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 参数将只生成 引用程序集。此选项对应于 MSBuildProduceOnlyReferenceAssembly 项目属性。

bash
csc -refonly -target:library Class1.cs

这时仅生成 Class1.dll 文件,而且是 引用程序集

使用 -refout 参数时需通过 -refout:filepath 的格式指定 引用程序集 的输出路径。此选项对应于 MSBuildProduceReferenceAssembly 项目属性。

bash
csc -refout:ref\Class1Ref.dll -target:library Class1.cs

会生成 Class1.dllref 目录下的 Class1Ref.dll 文件,其中 Class1.dll 文件是 实现程序集Class1Ref.dll 文件是 引用程序集

关于为何要使用引用程序集以及如何使用可以参考 这篇文档