↓推荐关注↓

前言

.NET 首席项目经理凯瑟琳在博客中介绍了 C# 11 的一些预览性新功能,这些功能可以在 Visual Studio 17.1 和 .NET SDK 6.0.200 中体验,下面摘录一部分新特性作介绍:

C# 11 预览:允许在内插字符串的“插值表达式”中换行

(interpolated strings)是 C# 6.0 引入的语法,它**允许在字符串中插入表达式。**C# 的内插字符串分为非逐字和逐字内插字符串(分别是 $”” 和 $@””)两种。两者最大的区别是:非逐字内插字符串与普通字符串一样,不能在字符串文本中包含换行符,必须使用转义符(如r、n)。相反,逐字插值字符串可以在其文本段中包含换行符c#换行,并且不会转义换行符或其他字符。

但是,非逐字插值字符串中的“换行符限制”,从字符串文本扩散到了文本之外的 插值表达式 ,这导致了很多不必要的限制。比如在 C# 11 之前,下面这段代码编译起来会报错:

var v = $"Count ist: this.Is.A.Really()
                            .That.I.Should(
                                be + able)[
                                    to.Wrap()] }
."
;

但在 C# 11 预览版中,它是合法的,可以正常编译。

关于该新特性的详细讨论可查看 GitHub Issue #4935。

C# 11 预览:列表模式

c fprintf 换行_c# 换行_c#换行

新的 列表模式 允许将数组或列表与一系列模式匹配,例如 array is [1, 2, 3] 将匹配长度为 3 的整数数组,其元素分别为 1、2、3。除了允许匹配列表和数组,还可以匹配元素,且可以选择包含零个或多个元素的*切片模式。*使用切片模式可以丢弃或捕获零个或多个元素。

列表模式的语法是用方括号括起来的值,切片模式的语法是两个点 **..**。切片模式后面可以跟着另一个列表模式,比如 var 模式来捕获切片内容。

比如,该模式匹配以下所有内容:[1, 2, .., 10]:

int[] arr1 = { 1210 };
int[] arr1 = { 12510 };
int[] arr1 = { 125678910 };

要探索列表模式,请参考:

public static int CheckSwitch(int[] values)
    => values switch
    {
        [1, 2, .., 10] => 1,
        [1, 2] => 2,
        [1, _] => 3,
        [1, ..] => 4,
        [..] => 50
    };

当它传递以下数组时,结果如下所示:

WriteLine(CheckSwitch(new[] { 1210 }));          // prints 1
WriteLine(CheckSwitch(new[] { 1273310 })); // prints 1
WriteLine(CheckSwitch(new[] { 12 }));              // prints 2
WriteLine(CheckSwitch(new[] { 13 }));              // prints 3
WriteLine(CheckSwitch(new[] { 135 }));           // prints 4
WriteLine(CheckSwitch(new[] { 2567 }));        // prints 50

还可以捕获切片模式的结果:

public static string CaptureSlice(int[] values)
    => values switch
    {
        [1, .. var middle, _] => $"Middle {String.Join(", ", middle)}",
        [.. var all] => $"All {String.Join(", ", all)}"
    };

C# 11 预览:新的参数空值检查

c fprintf 换行_c# 换行_c#换行

C# 11 提供了一种简化的语法,用于验证方法的参数不是 null ,以及正确抛出 ArgumentNullException。

以前可以使用样板代码的变体来验证方法参数是否为空:

public static void M(string s)
{
    if (s is null)
    {
        throw new ArgumentNullException(nameof(s));
    }
    // Body of the method
}

使用新的参数 null 检查,可以通过添加 !! 到参数名c#换行,自动执行空值检查:

public static void M(string s!!)
{
    // Body of the method
}

自动生成的空值检查代码将在方法主体的代码之前执行。对于构造器,该空值检查发生在字段初始化、调用 base 构造函数和调用 this 构造函数之前。

限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688