介绍

接下来我将给大家重点介绍一下.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

公众号

原文地址:http://www.cnblogs.com/MrChuJiu/p/16924393.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性