C# 11 讲解一

介绍

接下来我将给大家重点介绍一下.Net 6 之后的一些新的变更,文章都是来自于外国大佬的文章,我这边进行一个翻译,并加上一些自己的理解和解释。

源作者链接:https://blog.okyrylchuk.dev/twelve-csharp-11-features

正文

Required Members 替代构造函数

C# 11 required为属性和字段引入了一个新的修饰符,以强制构造函数和调用方初始化这些值。如果用缺少的必需成员初始化对象,则会出现编译错误。

// Initializations with required properties - valid
var p1 = new Person { Name = "Oleg", Surname = "Kyrylchuk" };
Person p2 = new("Oleg", "Kyrylchuk");

// Initializations with missing required properties - compilation error
var p3 = new Person { Name = "Oleg" };
Person p4 = new();

public class Person
{
    public Guid Id { get; set; } = Guid.NewGuid();
    public required string Name { get; set; }
    public required string Surname { get; set; }
}

如果你有多个参数化的构造函数,你应该SetsRequiredMembers在构造函数上添加属性,它初始化所有必需的成员。它通知编译器正确的构造函数。

public class Person
{
    public Person() { }

    [SetsRequiredMembers]
    public Person(string name, string surname)
    {
        Name = name;
        Surname = surname;
    }

    public Guid Id { get; set; } = Guid.NewGuid();
    public required string Name { get; set; }
    public required string Surname { get; set; }
}

JSON字符串文本

C# 11 引入了原始字符串文字。它允许在不转义的情况下包含任意文本。

格式至少是三个双引号""".."""。如果您的文本包含三个双引号,则应使用四个双引号将其转义。

结合字符串插值, 的计数$表示有多少个连续的大括号开始和结束插值。在下面的例子中,我想在已经包含单大括号的 JSON 中使用插值{}。它会与字符串插值冲突,所以我用两个$$来表示双括号{{}}开始和结束插值。

string name = "Oleg", surname = "Kyrylchuk";

string jsonString = 
    $$"""
    {
        "Name": {{name}},
        "Surname": {{surname}}
    }
    """;

Console.WriteLine(jsonString);

List Patterns

C# 11 引入了列表模式 对于某些业务处理可能有用。

它扩展了模式匹配以匹配数组或列表中的元素序列。您可以将列表模式与任何模式结合使用,包括常量、类型、属性和关系模式。

var numbers = new[] { 1, 2, 3, 4 };

// List and constant patterns
Console.WriteLine(numbers is [1, 2, 3, 4]); // True
Console.WriteLine(numbers is [1, 2, 4]);    // False

// List and discard patterns
Console.WriteLine(numbers is [_, 2, _, 4]); // True
Console.WriteLine(numbers is [.., 3, _]);   // True

// List and logical patterns
Console.WriteLine(numbers is [_, >= 2, _, _]); // True

字符串插值表达式中的换行符

有点像page中写C#代码

它允许 {} 之间的任何有效 C# 代码(包括换行符)以提高可读性。

在插值中使用较长的 C# 表达式(如模式匹配开关表达式或 LINQ 查询)时,它很有用。

// switch expression in string interpolation
int month = 5;
string season = $"The season is {month switch
{
    1 or 2 or 12 => "winter",
    > 2 and < 6 => "spring",
    > 5 and < 9 => "summer",
    > 8 and < 12 => "autumn",
    _ => "unknown. Wrong month number",
}}.";

Console.WriteLine(season);
// The season is spring.

// LINQ query in string interpolation
int[] numbers = new int[] { 1, 2, 3, 4, 5, 6 };
string message = $"The reversed even values of {nameof(numbers)} are {string.Join(", ", numbers.Where(n => n % 2 == 0)
                             .Reverse())}.";

Console.WriteLine(message);
// The reversed even values of numbers are 6, 4, 2.

结语

联系作者:加群:867095512 @MrChuJiu

公众号

posted @ 2022-11-25 10:33  初久的私房菜  阅读(286)  评论(0编辑  收藏  举报
作者:初久的私房菜
好好学习,天天向上
返回顶部小火箭
好友榜:
如果愿意,把你的博客地址放这里
张弛:https://blog.zhangchi.fun/