C#11新特性学习

目录

支持Json字符串

保留空格

支持内插字符

泛型属性

UTF-8 字符串字面量

列表模式


支持Json字符串

        static void Main(string[] args)
        {
            // 无需转义符 处理 json 字符串
            var json = """
                    {
                      "name": "Andy",
                      "age": 18
                    }
                    """;
            Console.WriteLine(json);
            Console.ReadLine();
 
        }

还支持 html 和 xml 原始字符串的使用,无需转义符

        static void Main(string[] args)
        {
            // 无需转义符 处理 html 字符串
            var json = """
                    
                    
                    
                    
                    示例
                    
                    
                        

我是标题

我是段落。

"""; Console.WriteLine(json); Console.ReadLine(); }

保留空格

C# 11 保留原始字符串的空格及其位置

        static void Main(string[] args)
        {
            // 无需转义符 处理 html 字符串
            var str= """
                    Hello World!
                          hi!
                                。。。。。。
                    """;
            Console.WriteLine(str);
            Console.ReadLine();
        }

输出的内容将保留空格输出。

支持内插字符

单个 $ 字符,在原始字符串中使用内插字符:

        static void Main(string[] args)
        {
            string name = "hello";
            var str = $"""
                       {name}
                       """;
            Console.WriteLine(str);
            Console.ReadLine();
        }

泛型属性

在 C# 11 之前,我们是继承 System.Attribute,在自定义属性类时,通过 System.Type 在类中作为构造函数的参数传递。

    [AttributeUsage(AttributeTargets.Class)]
    public class MyAttribute : Attribute
    {
        public MyAttribute(Type t)
        {
            ParamType = t;
        }
        public Type ParamType { get; }
    }
 
    [MyAttribute(typeof(string))]
    public class People
    {
        public string Name { get; set; }
    }

C# 11 支持泛型属性,不再需要将 System.Type 作为参数传递给构造函数。并且可以拥有一个或者多个参数,同时泛型实现类型安全。

    [AttributeUsage(AttributeTargets.Class)]
    public class MyAttribute : Attribute where T : class
    {
        public MyAttribute()
        {
        }
        public Type ParamType { get; }
    }
 
    [MyAttribute()]
    public class People
    {
        public string Name { get; set; }
    }

UTF-8 字符串字面量

在 Web 编程中常使用 UTF-8 (HTTP协议的默认编码就是 UTF-8 )。在.NET中,字符串的默认编码使用UTF-16。

  • 字符串 Hello 对应 ASCII 编码转 16 进制为: 0x48, 0x65, 0x6C, 0x6C, 0x6F;
  • UTF-8 字符串文字使用的是 ReadOnlySpan 类型存储;

在 C# 11之前,把 UTF-8 转成十六进制还是挺麻烦的,以往的写法:

ReadOnlySpan ut8_byte = new byte[] { 0x48, 0x65, 0x6C, 0x6C, 0x6F };

C# 支持保持原本字符串文字,添加 u8 后缀:

ReadOnlySpan ut8_byte = "Hello"u8;

列表模式

在 C# 11 之前,只能对单个元素进行模式匹配,无法对多个元素进行匹配:

        static void Main(string[] args)
        {
 
            Console.WriteLine(GetCalendarSeason(DateTime.Now));
            Console.ReadLine();
        }
 
        static string GetCalendarSeason(DateTime date) => date.Month switch
        {
            >= 3 and < 6 => "春",
            >= 6 and < 9 => "夏",
            >= 9 and < 12 => "秋",
            12 or (>= 1 and < 3) => "冬",
            _ => throw new ArgumentOutOfRangeException(nameof(date), $"输入的月份不正确: {date.Month}."),
        };

从 C# 11 开始,可以将数组或列表与模式的序列进行匹配:

            int[] numbers = { 99, 100 };
            Console.WriteLine(numbers is [99, 100]);  // True
            Console.WriteLine(numbers is [88]);  // False
            Console.WriteLine(numbers is [0 or 99, <= 100]);  // True
        static void Main(string[] args)
        {
            List numbers = new() { 1, 2, 3 };
 
            if (numbers is [var first, _, _])
            {
                Console.WriteLine($"输入第一个元素 {first}.");
            }
 
            Console.ReadLine();
        }

参考文章:C# 11 新特性_夜飞鼠的博客-CSDN博客

你可能感兴趣的:(C#,学习,c#)