首页 > 编程语言 >C#11新特性整理

C#11新特性整理

时间:2023-01-19 20:00:46浏览次数:62  
标签:11 Console C# 特性 l1 字符串 public

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

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

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
    <RootNamespace>_NET7</RootNamespace>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

二、泛型属性

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

public class CommonAttribute<T> : Attribute
{
    public T Property {get;set;}

    public CommonAttribute() 
    {
        
    }

    public CommonAttribute(T realvalue) :this()
    {
        Property = realvalue;
    }
}

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

public class User
{
    [CommonAttribute<int>]
    public int UserID { get; set;}

    [CommonAttribute<string>("defaultValue")]
    public string UserName { get; set;}
}

三、非空校验

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

public User GetUser(string name)
{
    ArgumentNullException.ThrowIfNull(nameof(name));
    // Rest of code
}

在C#11中,在参数上加2个!就实现了非空校验

 

 四、字符串内的换行符

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

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

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

五、列表模式匹配

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

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

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

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

写几个列子看看:

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

 

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

 

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

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

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

  调试输出:List Pattern Matched 3

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

var l1 = new[] { 1, 2, 3, 4,5 };
var l2 = new[] { 1, 3, 5 };
var l3 = new[] { 1};
var l4 = new[] { 9 };
var l5 = new[] { 1,6 };

string PatternTest(int[] collection) => collection switch
{
    [1, 2, 3, 4, 5] => "first", // list
    [1, 3, .., 5] => "second", // slice in list
    [1, _] => "third", // list
    [1, ..] => "fourth", //slice in list
    [..] => "fifth" // slice
};

Console.WriteLine(PatternTest(l1));
Console.WriteLine(PatternTest(l2));
Console.WriteLine(PatternTest(l3));
Console.WriteLine(PatternTest(l4));
Console.WriteLine(PatternTest(l5));

实际输出:

first
second
fourth
fifth
third

 六、原始字符串

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

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

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

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

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

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

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

 

周国庆

2023/1/19

标签:11,Console,C#,特性,l1,字符串,public
From: https://www.cnblogs.com/tianqing/p/17062055.html

相关文章

  • unknow or unsupported command install
    错误原因:今天使用pip下载labelimg时,出现了“unknoworunsupportedcommandinstall”的错误,这是由于电脑有多个pip文件路径所导致。如图,在cmd命令行中输入“wherepip”......
  • 基于docker搭建redis集群
    在docker已安装完毕的情况下,拉取redis镜像#这里拉取最新的redis镜像。当然也可以拉取指定版本的镜像dockerpullredis:5.0dockerpullredis创建redis容器#命令如下......
  • 230119_50_SpringBoot入门
    多环境配置文件指定方式一:properites文件文件名可以是application-{profile}.properties/yml,用来指定多个环境版本:server.port=8081//testserver.port=80......
  • Linux下缺少libiconv.so.2的解决方法
    1、手动下载安装http://ftp.gnu.org/pub/gnu/libiconv/2、在当前目录下解压,并进入解压后的文件夹,后续步骤全程用管理员权限进行tar-zxvflibiconv-1.16.1.tar.gzc......
  • C语言自加问题与整形提升
    提问:   在程序里,++a和+a在sizeof里,明显++a没有进行运算而+a进行运算并整形提升,这是为什么?解答: 这跟提升没有关系,这是运算优先级问题++a,运算优先级最高,所以是先进......
  • leetcode1030
    leetcode1030_距离顺序排列矩阵单元格给出R行C列的矩阵,其中的单元格的整数坐标为(r,c),满足0<=r<R且0<=c<C。另外,我们在该矩阵中给出了一个坐标为 (r0......
  • 【DFS】LeetCode 226. 翻转二叉树
    题目链接226.翻转二叉树思路将左右子树抽象为两个结点,直接进行交换。然后再递归左右子树。代码classSolution{publicTreeNodeinvertTree(TreeNoderoot){......
  • 一个C#将字节流通过管道传输到C++的问题
    提问: 提问一个C#将字节流通过管道传输到C++的问题现有一个字节流数据需要通过管道传输到C++,目前使用的方法是转成string通过WriteLine写入管道中,在C++中通过ReadFile读取......
  • 如何使用C语言实现汉诺塔
    现有3个柱子A、B、C,有n个圆盘在A柱上,要实现n个圆盘要从A柱从大到小移动到C柱。思路:先将n-1个圆盘移动到B柱上,然后将最后一个圆盘移动到C柱上,最后将B柱上的n-1个圆盘移动到C......
  • 智能文本自动处理(Intelligent text automatic processing)
    AutoText智能文本自动处理工具(Intelligenttextautomaticprocessingtool)。项目地址:https://github.com/jiangnanboy/AutoTextAutoText的功能主要有文本纠错,图片ocr以......