C#11新特性预览及使用介绍

 更新时间:2022年05月14日 12:47:13   作者:溪源More  
这篇文章主要为大家介绍了C#11新特性预览及使用介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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

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

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

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

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

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

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

C# 11 预览:列表模式

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

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

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

int[] arr1 = { 1, 2, 10 };
int[] arr1 = { 1, 2, 5, 10 };
int[] arr1 = { 1, 2, 5, 6, 7, 8, 9, 10 };

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

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

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

WriteLine (CheckSwitch (new[] { 1, 2, 10 }));          // prints 1
WriteLine (CheckSwitch (new[] { 1, 2, 7, 3, 3, 10 })); // prints 1
WriteLine (CheckSwitch (new[] { 1, 2 }));              // prints 2
WriteLine (CheckSwitch (new[] { 1, 3 }));              // prints 3
WriteLine (CheckSwitch (new[] { 1, 3, 5 }));           // prints 4
WriteLine (CheckSwitch (new[] { 2, 5, 6, 7 }));        // prints 50

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

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

列表模式适用于任何可计数和可索引的类型 —— 这意味着它有一个可访问的LengthCount属性,以及一个带intSystem.Index形参的索引器。

切片模式适用于任何可计数和可切片的类型 —— 这意味着它有一个以Range为实参的可访问索引器,或者具有两个int形参的可访问Slice方法。

目前正在考虑在 IEnumerable 类型上添加对列表模式的支持,点此查看关于该列表模式的详细介绍。

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

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

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

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

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

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

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

有关该新的参数空值检查,可在此查看详细介绍。

如何尝试预览特性

若要尝试 C# 11 的预览特性,请创建一个 C# 项目,并将 LangVersion 设置为 preview,.csproj文件配置如下:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <LangVersion>preview</LangVersion>
    </PropertyGroup>
</Project>

有关 C# 11 的更多详细内容及新特性的资料请关注得牛网其它相关文章,或通过 GitHub 上的 CSharpLang 存储库进行讨论!

相关文章

  • C#3.0中Lambda表达式详解

    C#3.0中Lambda表达式详解

    在C#3.0中,微软给我带来的一些新特性可能是以前所有开发语言都没有的特性。这无疑大大的体现了C#3.0在开发语言中强大的优势
    2013-09-09
  • C#操作Excel相关方法总结

    C#操作Excel相关方法总结

    这篇文章主要介绍了C#操作Excel相关方法总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • C#实现截取验证码图片

    C#实现截取验证码图片

    这篇文章主要为大家详细介绍了C#实现截取验证码图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 手动编译C#代码的方法

    手动编译C#代码的方法

    在本文里小编给大家分享的是关于手动编译C#代码的方法和步骤,对此有需要的朋友们可以学习下。
    2018-12-12
  • C#获取指定目录下指定文件的方法

    C#获取指定目录下指定文件的方法

    这篇文章介绍了C#获取指定目录下指定文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • winform树形菜单无限级分类实例

    winform树形菜单无限级分类实例

    本文介绍了“winform树形菜单无限级分类实例”,需要的朋友可以参考一下
    2013-03-03
  • C# 基于TCP 实现扫描指定ip端口的方式示例

    C# 基于TCP 实现扫描指定ip端口的方式示例

    本文主要介绍了C#基于TCP实现扫描指定ip端口的方式示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C#中的只读结构体(readonly struct)详解

    C#中的只读结构体(readonly struct)详解

    这篇文章主要给大家介绍了关于C#中只读结构体(readonly struct)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C#并行编程之信号量

    C#并行编程之信号量

    这篇文章介绍了C#并行编程之信号量,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#中DataTable实现行列转换的方法

    C#中DataTable实现行列转换的方法

    这篇文章主要介绍了C#中DataTable实现行列转换的方法,实例分析了C#操作DataTable的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04

最新评论