目录
支持Json字符串
保留空格
支持内插字符
泛型属性
UTF-8 字符串字面量
列表模式
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; }
}
在 Web 编程中常使用 UTF-8 (HTTP协议的默认编码就是 UTF-8 )。在.NET中,字符串的默认编码使用UTF-16。
在 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博客