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