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

目录
  • C# 11 预览:允许在内插字符串的“插值表达式”中换行
  • C# 11 预览:列表模式
  • 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 存储库进行讨论!

(0)

相关推荐

  • C#6.0中你可能不知道的新特性总结

    为什么写? 今天去上班的公交上,有朋友在张队(张善友)的微信群里,发了一个介绍C# 6.0新特性的视频,视频7分钟,加上本人英语实在太low,整体看下来是一脸懵逼的. 下班回到家里,打开这个视频,把视频中介绍的新特性用文档的形式记录下来,加深自己的印象,此处把我整理的文档分享出来,希望对大家能有所帮助! C#6.0已经发布快三年了,可能我们没有有太去关心新版本所加入的特性,有人说,发布新版本,无非就是添加一些"语法糖"罢了,不管是糖不是糖,既然加入了新功能,那么自然有新功能的好处,我们

  • C++ 11和C++98相比有哪些新特性

    C++11标准提供了许多有用的新特性.这篇文章特别针对使C++11和C++98相比看上去像一门新语言的特性,因为: C++11改变了书写C++代码的风格和习惯,也改变了设计C++库的方式.例如,你会看到更多的被当作参数和返回值的智能指针,还有按值(by value)返回巨大对象的函数. 它们被使用的非常广泛,在大多数代码中你都能看到它们.举个例子,在现代C++中几乎每5行C++代码你就能看到auto关键字. 还有一些其它的非常好的C++11新特性,但先把这篇文章所描述的新特性熟悉起来把,因为这些

  • C#7.0中新特性汇总

    以下将是 C# 7.0 中所有计划的语言特性的描述.随着 Visual Studio "15" Preview 4 版本的发布,这些特性中的大部分将活跃起来.现在是时候来展示这些特性,你也告诉借此告诉我们你的想法! C#7.0 增加了许多新功能,并专注于数据消费,简化代码和性能的改善.或许最大的特性就是元祖和模式匹配,元祖可以很容易地拥有多个返回结果,而模型匹配可以根据数据的"形"的不同来简化代码.我们希望,将它们结合起来,从而使你的代码更加简洁高效,也可以使你更加

  • C# 9 新特性——record的相关总结

    Intro C# 9 中引入了 record,record 是一个特殊类,用它来实现 model 在有些情况下会非常的好用 Sample record RecordPerson { public string Name { get; init; } public int Age { get; init; } } record RecordPerson2(string Name, int Age); public static void MainTest() { var p1 = new Reco

  • 深入浅析C# 11 对 ref 和 struct 的改进

    目录 前言 背景 ref 字段 生命周期 scoped unscoped ref struct 约束 反射 实际用例 栈上定长列表 栈上链表 未来计划 高级生命周期 总结 前言 C# 11 中即将到来一个可以让重视性能的开发者狂喜的重量级特性,这个特性主要是围绕着一个重要底层性能设施 ref 和 struct 的一系列改进. 但是这部分的改进涉及的内容较多,不一定能在 .NET 7(C# 11)做完,因此部分内容推迟到 C# 12 也是有可能的.当然,还是很有希望能在 C# 11 的时间点就看到

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

    目录 C# 11 预览:允许在内插字符串的“插值表达式”中换行 C# 11 预览:列表模式 C# 11 预览:新的参数空值检查 如何尝试预览特性 .NET 首席项目经理凯瑟琳在博客中介绍了 C# 11 的一些预览性新功能,这些功能可以在 Visual Studio 17.1 和 .NET SDK 6.0.200 中体验,下面摘录一部分新特性作介绍: C# 11 预览:允许在内插字符串的“插值表达式”中换行 内插字符串(interpolated strings)是 C# 6.0 引入的语法,它允许

  • Python3.6正式版新特性预览

    按照Python官网上的计划,Python3.6正式版期望在2016-12-16号发布,也就是这周五.从去年的5月份开始,Python3.6版本就已经动手开发了,期间也断断续续的发布了4个Alpha版,4个Beta版,以及一个Candidate版本. 作为一个Python爱好者,很期待新版本的发布,也希望能第一时间尝试一下新特性.本文就根据Python官网文章What's New In Python 3.6,简单介绍下Python3.6中的一些新特性. 如果你想尝试Python3.6,又不想破坏

  • PHP6 中可能会出现的新特性预览

    这些特性包括: 集成OpCache(OPcache通过对PHP的opcode进行缓存和优化,可以提高PHP程序的执行速度)    改善对64位环境的支持    支持Unicode    清理内部API    提升代码质量,做到Warning-Free    改善OPcodes.编译器.运行时    JIT编译器(LibJIT?)    支持Annotation(注解?)    命名自变量(Named argument)    不同等级的类型提示    支持HTTP 2.0协议(可能会使用nght

  • golang1.16新特性速览(推荐)

    golang1.16也在今天正式发布了. 原定计划是2月1号年前发布的,不过迟到也是golang的老传统了,正好也趁着最后的假期快速预览一下golang1.16的新特性吧. 语言內建的资源嵌入支持 之前市面上已经有很多把今天文件嵌入golang二进制程序的工具了,这次golang官方将这一功能加入了embed标准库,从语言层面上提供了支持. 我之前以及写了embed的使用教程,可以看这里. 这儿还有一篇官方推荐的教程. 支持arm64 m1芯片可谓是最近的焦点,golang自然也不会落下. 在g

  • C++11新特性中auto 和 decltype 区别和联系

    C++11新特性中auto 和 decltype 区别和联系 一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型.和原来那些只对应某种特定的类型说明符(例如 int)不同.auto 让编译器通过初始值来进行类型推演.从而获得定义变量的类型,所以说 auto 定义的变量必须有初始

  • 浅析C++11新特性的Lambda表达式

    lambda简介 熟悉Python的程序员应该对lambda不陌生.简单来说,lambda就是一个匿名的可调用代码块.在C++11新标准中,lambda具有如下格式: [capture list] (parameter list) -> return type { function body } 可以看到,他有四个组成部分: 1.capture list: 捕获列表 2.parameter list: 参数列表 3.return type: 返回类型 4.function body: 执行代码

  • C++ 11新特性之大括号初始化详解

    本文主要给大家介绍了关于C++11新特性之大括号初始化的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: C++11之前,C++主要有以下几种初始化方式: //小括号初始化 string str("hello"); //等号初始化 string str="hello"; //大括号初始化 struct Studnet{ char* name; int age; }; Studnet s={"dablelv",18}; //

  • 详解c++11新特性之模板的改进

    C++11关于模板有一些细节的改进: 模板的右尖括号 模板的别名 函数模板的默认模板参数 模板的右尖括号 C++11之前是不允许两个右尖括号出现的,会被认为是右移操作符,所以需要中间加个空格进行分割,避免发生编译错误. int main() { std::vector<std::vector<int>> a; // error std::vector<std::vector<int> > b; // ok } 这个我之前都不知道,我开始学编程的时候就已经是C

  • C++11新特性之自定义字面量

    1.示例 C++11新标准中引入了用户自定义字面量,也叫自定义后缀操作符,即通过实现一个后缀操作符,将申明了该后缀标识的字面量转化为需要的类型.考察如下代码: long double operator"" _mm(long double x) { return x / 1000; } long double operator"" _m(long double x) { return x; } long double operator"" _km(

  • c++11新特性多线程操作实战

    c++11多线程操作 线程 thread int main() { thread t1(Test1); t1.join(); thread t2(Test2); t2.join(); thread t3 = t1; thread t4(t1); thread t5 = std::move(t1); thread t6(std::move(t1)); return 0; } t3,t4创建失败,因为thread的拷贝构造和赋值运算符重载的原型是: thread(const thread&) = d

随机推荐