當前位置: 妍妍網 > 碼農

C# 13(.NET 9)新特性—擴充套件型別最佳化

2024-06-23碼農

前言

C# 13 即 .NET 9 按照計劃會在2024年11月釋出,目前一些新特性已經定型,讓我們來預覽一個比較大型比較重要的新特性。

正文

擴充套件型別 Extension types

在5月份的微軟 Build 大會中的 What’s new in C# 13 會議上,兩位大佬花了很長的篇幅來演示這個特性。

這個特性一直是大家很關心的,在 github 的 issue 上討論的也是如火如荼,當然微軟也鴿了好多年。

首先,讓我們來回顧一下 C# 中的擴充套件方法

using System;
var zhangsan = new Person();
Console.WriteLine(zhangsan.GetAge());
public classPerson
{
publicstring Name { getset; } 
public DateTime Birthday { getset; }
}
publicstatic classPersonExtension
{
publicstaticintGetAge(this Person person) => DateTime.Now.Year - person.Birthday.Year;
}

以上程式碼演示了一個擴充套件方法聲明方式及使用方法。

我們在不侵入 Person 類的基礎上為 Person 類擴充套件了一個 GetAge() 的方法,雖然已經可以很方便的擴充套件出一些方法來,但是問題也是顯而易見的,例如必須聲明在靜態類中、語法看起來很怪異、只能擴充套件方法而不能擴充套件內容等等。

於是,在即將到來的 C# 13 中,我們可以這樣

var zhangsan = new Person();
Console.WriteLine(zhangsan.GetAge());
publicimplicit extension PersonExtension for Person
{
publicintGetAge() => DateTime.Now.Year - this.Birthday.Year;
}

怎麽樣,語意是不是清晰了很多?

進一步的,年齡應該是一個內容而不應該是一個方法

var zhangsan = new Person();
Console.WriteLine(zhangsan.Age);
publicimplicit extension PersonExtension for Person
{
publicint Age => DateTime.Now.Year - this.Birthday.Year;
}

困擾多年的如何擴充套件內容的問題終於得到了解決。

implicit extension / explicit extension

在上一個例子,不知道大家有沒有註意到關鍵字是 implicit extension,那麽很顯然,會有一個對應的 explicit extension,下面讓我們來看看花活

var zhangsan = new Person();
if(zhangsan.IsStudent)
{
Student zhangsanAsStudent = zhangsan;
Console.WriteLine(zhangsanAsStudent.Grade);
}
publicimplicit extension PersonExtension for Person
{
publicint Age => DateTime.Now.Year - this.Birthday.Year;
publicbool IsStudent => this.Age < 18;
}
publicexplicit extension Student for Person
{
publicstring Grade => "五年級";
}

可以看到,這裏有一個顯示擴充套件,顯式擴充套件可以建立原始類的投影或子類別。當你要基於擴充套件型別添加條件方法或內容時,這可能很有用。

當然,擴充套件靜態方法也是沒問題的

var zhangsan = Person.Create();
publicimplicit extension PersonExtension for Person
{
publicstatic Person Create() => new Person();
}

當然,系統型別也是支持的

Console.WriteLine("World".SayHello());
publicimplicit extension StringExtension forstring
{
publicstringSayHello() => "Hello" + this;
}

總結

我想這個特性是很大的一個改變,或授權以改進 C# 程式碼的組織方式,有望提高程式碼的可讀性、可維護性和表現力。

透過允許開發人員在不修改原始程式碼的情況下向現有類添加功能,它可以促進程式碼重用並減少修改原始類的需要。

另外據了解,這個特性以及相關特性,例如擴充套件介面等等,並不會在 C# 13 (.NET 9) 中完整的放出來,而是會在後續版本中逐漸解鎖。

轉自:Rwing

連結:cnblogs.com/Rwing/p/18261641/

Csharp_13_dot_net_9_preview_extension_types

- EOF -

推薦閱讀 點選標題可跳轉

看完本文有收獲?請轉發分享給更多人

推薦關註「DotNet」,提升.Net技能

點贊和在看就是最大的支持❤️