经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
C#11新特性整理
来源:cnblogs  作者:Eric zhou  时间:2023/1/20 8:40:13  对本文有异议

假期中有时间,整理了C#11的各个新特性,简单分享给大家。

一、使用VSCode新建一个.NET7.0的Console工程

  1. <Project Sdk="Microsoft.NET.Sdk">
  2. <PropertyGroup>
  3. <OutputType>Exe</OutputType>
  4. <TargetFramework>net7.0</TargetFramework>
  5. <RootNamespace>_NET7</RootNamespace>
  6. <ImplicitUsings>enable</ImplicitUsings>
  7. <Nullable>enable</Nullable>
  8. </PropertyGroup>
  9. </Project>

二、泛型属性

C # 11为开发人员提供了一种编写自定义通用属性的方法。

  1. public class CommonAttribute<T> : Attribute
  2. {
  3. public T Property {get;set;}
  4. public CommonAttribute()
  5. {
  6. }
  7. public CommonAttribute(T realvalue) :this()
  8. {
  9. Property = realvalue;
  10. }
  11. }

新建一个类,在属性上使用这个通用属性注解。原先是多个属性注解类型,现在一个泛型属性就可以搞定了

  1. public class User
  2. {
  3. [CommonAttribute<int>]
  4. public int UserID { get; set;}
  5. [CommonAttribute<string>("defaultValue")]
  6. public string UserName { get; set;}
  7. }

三、非空校验

原先在C#10中,可以这么写实现参数非空校验

  1. public User GetUser(string name)
  2. {
  3. ArgumentNullException.ThrowIfNull(nameof(name));
  4. // Rest of code
  5. }

在C#11中,原计划在参数上加2个!就实现了非空校验,实际测试是不支持的。

error CS8989: 不支持 'parameter null-checking' 功能。

 

 四、字符串内的换行符

字符串内插的 { 和 } 字符内的文本现在可以跨多个行。 

{ 和 } 标记之间的文本分析为 C#。 允许任何合法 C#(包括换行符)。

使用此功能可以更轻松地读取使用较长 C# 表达式的字符串内插,例如模式匹配 switch 表达式或 LINQ 查询。

五、列表模式匹配

列表模式扩展了模式匹配,以匹配列表或数组中的元素序列。

例如,当 sequence 为数组或三个整数(1、2 和 3)的列表时,sequence is [1, 2, 3] 为 true

可以使用任何模式(包括常量、类型、属性和关系模式)来匹配元素。

弃元模式 (_) 匹配任何单个元素,新的范围模式 (..) 匹配零个或多个元素的任何序列。

写几个列子看看:

  1. var l1 = new[] { 1, 2, 3, 4, 5 };
  2. if(l1 is [1, 2, 3, 4, 5] && l1 is [_,_,_,_,5])
  3. {
  4. Console.WriteLine("List Pattern Matched");
  5. }

 

 上述代码中,[_,_,_,_,5] ,可以这么理解:匹配长度为5且最后一个元素为5的任何集合。

 

 同时,切片模式进一步放大了列表模式的威力。例如,如果需要将任何少于或等于5个元素的集合与最后一个元素5匹配,则可以将上述模式修改为

  1. if (l1 is [.., 5])
  2. {
  3. Console.WriteLine("List Pattern Matched 3");
  4. }

   这段代码中 [..,5] 等同于 l1.Length>=1 && l1[^1]==5.

  调试输出:List Pattern Matched 3

   再写一个Switch模式匹配的例子

  1. var l1 = new[] { 1, 2, 3, 4,5 };
  2. var l2 = new[] { 1, 3, 5 };
  3. var l3 = new[] { 1};
  4. var l4 = new[] { 9 };
  5. var l5 = new[] { 1,6 };
  6. string PatternTest(int[] collection) => collection switch
  7. {
  8. [1, 2, 3, 4, 5] => "first", // list
  9. [1, 3, .., 5] => "second", // slice in list
  10. [1, _] => "third", // list
  11. [1, ..] => "fourth", //slice in list
  12. [..] => "fifth" // slice
  13. };
  14. Console.WriteLine(PatternTest(l1));
  15. Console.WriteLine(PatternTest(l2));
  16. Console.WriteLine(PatternTest(l3));
  17. Console.WriteLine(PatternTest(l4));
  18. Console.WriteLine(PatternTest(l5));

实际输出:

first
second
fourth
fifth
third

 六、原始字符串

原始字符串是字符串的一种新格式。

原始字符串可以包含任意文本,包括空格、新行、嵌入引号和其他特殊字符,无需转义字符(这个很关键、也很简单)

原始字符串以至少三个双引号 (""") 字符开头。 它以相同数量的双引号字符结尾。

通常,原始字符串在单个行上使用三个双引号来开始字符串,在另一行上用三个双引号来结束字符串。 左引号之后、右引号之前的换行符不包括在最终内容中。

详细的示例,可以看前段时间整理的一篇文章。

C#11新特性-Raw string literals原始字符串研究、示例

以上是这几天研究的C#11的新特性。分享给大家。

 

周国庆

2023/1/19

 

原文链接:https://www.cnblogs.com/tianqing/p/17062055.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号