前言
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 { get; set; }
public DateTime Birthday { get; set; }
}
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技能
點贊和在看就是最大的支持❤️