常量的内插字符串
C# 10 允许使用在常量字符串初始化中使用插值, 如下
1
2
3
4
5
|
const string name = "Oleg" ; const string greeting = $ "Hello, {name}." ; Console.WriteLine(greeting); // Output: Hello, Oleg. |
扩展属性模式
从 C# 10 开始,您可以在适当的模式中引用嵌套的属性或字段, 属性模式变得更具可读性并且需要更少的大括号。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
Person person = new () { Name = "Oleg" , Location = new () { Country = "PL" } }; if (person is { Name: "Oleg" , Location.Country: "PL" }) { Console.WriteLine( "It's me!" ); } class Person { public string Name { get ; set ; } public Location Location { get ; set ; } } class Location { public string Country { get ; set ; } } |
如果Location为null,则不会匹配模式并返回false。
文件范围的命名空间
C# 10 引入了一种新的命名空间声明方式 - 文件范围的命名空间,减少一个大括号,代码结构更简洁。
1
2
3
4
5
6
7
8
9
|
namespace FileScopedNamespace; class Program { static void Main( string [] args) { Console.WriteLine( "Hello World!" ); } } |
全局 Using
一次引用,全局通用
1
2
3
4
5
6
7
8
9
10
|
global using System; global using System.Collections.Generic; global using System.Linq; global using System.Threading.Tasks; List< int > list = new () { 1, 2, 3, 4 }; int sum = list.Sum(); Console.WriteLine(sum); await Task.Delay(1000); |
同一个解构中的赋值和声明
C# 10 可以在同一个解构中进行赋值和声明。
1
2
3
4
5
6
7
8
|
var rgb = (255, 100, 30); // Initialization & assignment int r; (r, int g, int b) = rgb; Console.WriteLine($ "RGB: {r}, {g}, {b}" ); // Output: RGB: 255, 100, 30 |
Record 类型重写 ToString() 时支持密封
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Product product = new () { Name = "Bread" }; Console.WriteLine(product.ToString()); // Output: Bread public record Product { public string Name { get ; init; } public sealed override string ToString() { return Name; } } |
Record Struct
C# 10 支持 record struct
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
Person me = new () { FirstName = "Oleg" , LastName = "Kyrylchuk" }; Console.WriteLine(me); // Output: Person { FirstName = Oleg, LastName = Kyrylchuk } Person otherPerson = me with { FirstName = "John" }; Console.WriteLine(otherPerson); // Output: Person { FirstName = John, LastName = Kyrylchuk } Person anotherMe = new () { FirstName = "Oleg" , LastName = "Kyrylchuk" }; C onsole.WriteLine(me == anotherMe); // Output: True record struct Person { public string FirstName { get ; init; } public string LastName { get ; init; } } record struct Product( string Name, decimal Price); |
Struct 字段支持初始化
1
2
3
4
5
6
7
8
9
10
11
12
|
using System; Person person = new () { Name = "Oleg" }; Console.WriteLine(person.Id + " " + person.Name); // Output: 0cc6caac-d061-4f46-9301-c7cc2a012e47 Oleg struct Person { public Guid Id { get ; init; } = Guid.NewGuid(); public string Name { get ; set ; } } |
Lambda 表达式的 Attributes 支持
C# 9 支持本地函数的 Attributes, C# 10 添加了 Lambda 表达式的 Attributes 支持。
1
2
3
4
5
6
7
|
Action a = [MyAttribute] () => { }; Action< int > b =[ return : MyAttribute] (x) => { }; Action< int > c =[MyAttribute] ([MyAttribute] x) => { }; class MyAttribute : Attribute { } |
Lambda 中的显式返回类型
1
2
3
4
5
6
7
8
9
10
|
Test< int >(); var l1 = string () => string .Empty; var l2 = int () => 0; var l3 = static void () => { }; void Test<T>() { var l4 = T () => default ; } |
应用于方法的 AsyncMethodBuilder 特性
从 C# 7 开始,您只能将AsyncMethodBuilder 特性应用于类型, 在 C# 10 中,您还可以将该特性应用于单个方法。
1
2
3
4
5
6
7
8
9
|
using System.Runtime.CompilerServices; class Example { [AsyncMethodBuilder( typeof (AsyncVoidMethodBuilder))] public void ExampleMethod() { } } |
结构体中的表达式
C# 10 支持 将 with 表达式和 struct 一起使用
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Product potato = new () { Name = "Potato" , Category = "Vegetable" }; Console.WriteLine($ "{potato.Name} {potato.Category}" ); // Output: Potato Vegetable Product tomato = potato with { Name = "Tomato" }; Console.WriteLine($ "{tomato.Name} {tomato.Category}" ); // Output: Tomato Vegetable struct Product { public string Name { get ; set ; } public string Category { get ; set ; } } |
匿名类型中的表达式
C# 10 支持 将 with 表达式和匿名类型一起使用
1
2
3
4
5
6
7
|
var potato = new { Name = "Potato" , Category = "Vegetable" }; Console.WriteLine($ "{potato.Name} {potato.Category}" ); // Output: Potato Vegetable var onion = potato with { Name = "Onion" }; Console.WriteLine($ "{onion.Name} {onion.Category}" ); // Output: Onion Vegetable |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://mp.weixin.qq.com/s/lrHV5rXwY1Z4azPJXW-pGQ