原文連結:https://blog.okyrylchuk.dev
原文作者:Oleg Kyrylchuk
譯: 等天黑
常量的內插字串
C# 10 允許使用在常量字串初始化中使用插值, 如下
const string name = "Oleg";
const string greeting = $"Hello, {name}.";
Console.WriteLine(greeting);
// Output: Hello, Oleg.
擴充套件屬性模式
從 C# 10 開始,您可以在適當的模式中引用巢狀的屬性或欄位, 屬性模式變得更具可讀性並且需要更少的大括號。
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 引入了一種新的名稱空間宣告方式 - 檔案範圍的名稱空間,減少一個大括號,程式碼結構更簡潔。
namespace FileScopedNamespace;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
全域性 Using
一次引用,全域性通用
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 可以在同一個解構中進行賦值和宣告。
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() 時支援密封
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
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 欄位支援初始化
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 支援。
Action a = [MyAttribute] () => { };
Action<int> b =[return: MyAttribute] (x) => { };
Action<int> c =[MyAttribute] ([MyAttribute] x) => { };
class MyAttribute : Attribute
{ }
Lambda 中的顯式返回型別
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 中,您還可以將該特性應用於單個方法。
using System.Runtime.CompilerServices;
class Example
{
[AsyncMethodBuilder(typeof(AsyncVoidMethodBuilder))]
public void ExampleMethod()
{
}
}
結構體中的表示式
C# 10 支援 將 with 表示式和 struct 一起使用
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 表示式和匿名型別一起使用
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