C# 13(.Net 9) 中的新特性 - 擴展類型

来源:https://www.cnblogs.com/Rwing/p/18261641/Csharp_13_dot_net_9_preview_extension_types
-Advertisement-
Play Games

C# 13 即 .Net 9 按照計劃會在2024年11月發佈,目前一些新特性已經定型,今天讓我們來預覽一個比較大型比較重要的新特性: 擴展類型 extension types ...


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 class Person
{
    public string Name { get; set; } 
    public DateTime Birthday { get; set; }
}

public static class PersonExtension
{
    public static int GetAge(this Person person) => DateTime.Now.Year - person.Birthday.Year;
}

以上代碼演示了一個擴展方法聲明方式及使用方法。
我們在不侵入 Person 類的基礎上為 Person 類擴展了一個 GetAge() 的方法,雖然已經可以很方便的擴展出一些方法來,但是問題也是顯而易見的,例如必須聲明在靜態類中、語法看起來很怪異、只能擴展方法而不能擴展屬性等等。
於是,在即將到來的 C# 13 中,我們可以這樣

var zhangsan = new Person();
Console.WriteLine(zhangsan.GetAge());

public implicit extension PersonExtension for Person
{
    public int GetAge() => DateTime.Now.Year - this.Birthday.Year;
}

怎麼樣,語義是不是清晰了很多?
進一步的,年齡應該是一個屬性而不應該是一個方法

var zhangsan = new Person();
Console.WriteLine(zhangsan.Age);

public implicit extension PersonExtension for Person
{
    public int 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);
}

public implicit extension PersonExtension for Person
{
    public int Age => DateTime.Now.Year - this.Birthday.Year;
    public bool IsStudent => this.Age < 18;
}

public explicit extension Student for Person
{
    public string Grade => "五年級";
}

可以看到,這裡有一個顯示擴展,顯式擴展可以創建原始類的投影或子類。當你要基於擴展類型添加條件方法或屬性時,這可能很有用。

當然,擴展靜態方法也是沒問題的

var zhangsan = Person.Create();

public implicit extension PersonExtension for Person
{
    public static Person Create() => new Person();
}

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

Console.WriteLine("World".SayHello());

public implicit extension StringExtension for string
{
    public string SayHello() => "Hello" + this;
}

結尾

我想這個特性是很大的一個改變,或許可以改進 C# 代碼的組織方式,有望提高代碼的可讀性、可維護性和表現力。通過允許開發人員在不修改原始代碼的情況下向現有類添加功能,它可以促進代碼重用並減少修改原始類的需要。
另外據瞭解,這個特性以及相關特性,例如擴展介面等等,並不會在 C# 13 (.Net 9) 中完整的放出來,而是會在後續版本中逐漸解鎖。

參考

https://build.microsoft.com/en-US/sessions/689e5104-72e9-4d02-bb52-77676d1ec5bc?source=sessions
https://devblogs.microsoft.com/dotnet/dotnet-build-2024-announcements/
https://github.com/dotnet/csharplang/issues/5497


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 模型 來看兩種不同類型的模型--LLM 和聊天模型。然後,它將介紹如何使用提示模板來格式化這些模型的輸入,以及如何使用輸出解析器來處理輸出。 LangChain 中的語言模型有兩種類型: 1.1 Chat Models 聊天模型通常由 LLM 支持,但專門針對會話進行了調整。提供者 API 使用 ...
  • 今天我們還講講Consumer、Supplier、Predicate、Function這幾個介面的用法,在 Java8 的用法當中,這幾個介面雖然沒有明目張膽的使用,但是,卻是潤物細無聲的。為什麼這麼說呢?這幾個介面都在 java.util.function 包下的,分別是Consumer(消費型) ...
  • pip install --upgrade langchain==0.0.279 -i https://pypi.org/simple 1 創建一個LLM 自有算力平臺+開源大模型(需要有龐大的GPU資源)企業自己訓練數據 第三方大模型API(openai/百度文心/阿裡通義千問...)數據無所謂 ...
  • LLM大模型與AI應用的粘合劑。 1 langchain是什麼以及發展過程 LangChain是一個開源框架,旨在簡化使用大型語言模型構建端到端應用程式的過程,也是ReAct(reason+act)論文的落地實現。 2022年10月25日開源 54K+ star 種子輪一周1000萬美金,A輪250 ...
  • 1.創建一個文件夾HCJV_01 2.vscode打開該文件夾,打開終端。 3.使用vite安裝,選擇vue,選擇JavaScript,項目名稱demo01 cnpm create vite@latest 4.跳轉demo01目錄下 cd demo01 5.安裝cnpm cnpm install 嘗 ...
  • 下麵將完成的展示,使用MAPI介面操作Outlook完成通訊錄更新。 using Microsoft.Office.Interop.Outlook; using Microsoft.VisualBasic; using System; using System.Collections; using ...
  • 前言 之前已經分享過幾篇關於中台項目框架的文章,相關介紹就不再贅述 所謂工欲善其事必先利其器,一個項目擁有一個代碼生成器是很有必要的,能夠大大的節省時間,減少手誤,提供開發效率(ps:特別小團隊搞微服務但是沒有代碼生成器,簡直要了老命) 本文將分享如何在中台框架項目 Admin.Core 中添加代碼 ...
  • 官網:Git for Windows 點擊下載安裝。 右擊滑鼠會出現GUI和Bash 選擇git bash here 配置全局用戶名和郵箱(gitee) git config --global user.name "你的名字" git config --global user.email 你的郵箱 ...
一周排行
    -Advertisement-
    Play Games
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他們的程式會偶發性的卡死一段時間,然後又好了,讓我幫忙看下怎麼回事?窗體類的程式解決起來相對來說比較簡單,讓朋友用procdump自動抓一個卡死時的dump,拿到dump之後,上 windbg 說話。 二:WinDbg 分析 1. 主線程在做什麼 要想 ...
  • 功能說明 使用ListView時,希望可以在單元格顯示圖片或其他控制項,發現原生的ListView不支持,於是通過拓展,實現ListView可以顯示任意控制項的功能,效果如下: 實現方法 本來想著在單元格裡面實現控制項的自繪的,但是沒找到辦法,最後是通過在單元格的錶面顯示對應控制項的,浮於錶面達到目的。 實 ...
  • 由於.NET Framework 4.0 是比較古老的版本,只有New Relic 7.0以下的版本才會支持.NET Framework 4.0的引用程式。 Technical support for .NET Framework 4.0 or lower 你可以參考這個官方Install New ...
  • 前言 隨著 DEV24.1.3 的發佈,XAF Blazor 中的屬性編輯器(PropertyEditor)也進行了很大的改動,在使用體驗上也更接近 WinForm 了,由於進行了大量的封裝,理解上沒有 WinForm 直觀,所以本文通過對屬性編輯器的原理進行解析,並對比新舊版本中的變化,使大家能夠 ...
  • OPC基金會提供了OPC UA .NET標準庫以及示常式序,但官方文檔過於簡單,光看官方文檔和示常式序很難弄懂OPC UA .NET標準庫怎麼用,花了不少時間摸索才略微弄懂如何使用,以下記錄如何從一個控制台程式開發一個OPC UA伺服器。 安裝Nuget包 安裝OPCFoundation.NetSt ...
  • 今天在技術群里,石頭哥向大家提了個問題:"如何在一個以System身份運行的.NET程式(Windows Services)中,以其它活動的用戶身份啟動可互動式進程(桌面應用程式、控制台程式、等帶有UI和互動式體驗的程式)"? 我以前有過類似的需求,是在GitLab流水線中運行帶有UI的自動化測試程 ...
  • .Net 中提供了一系列的管理對象集合的類型,數組、可變列表、字典等。從類型安全上集合分為兩類,泛型集合 和 非泛型集合,傳統的非泛型集合存儲為Object,需要類型轉。而泛型集合提供了更好的性能、編譯時類型安全,推薦使用。 ...
  • 在以前我做程式的時候,一般在登錄視窗裡面顯示程式名稱,登錄視窗一般設置一張背景圖片,由於程式的名稱一般都是確定的,所以也不存在太大的問題,不過如果客戶定製不同的系統的時候,需要使用Photoshop修改下圖層的文字,再生成圖片,然後替換一下也可以了。不過本著減少客戶使用繁瑣性,也可以使用空白名稱的通... ...
  • 一:背景 1. 講故事 在dump分析的過程中經常會看到很多線程卡在Monitor.Wait方法上,曾經也有不少人問我為什麼用 !syncblk 看不到 Monitor.Wait 上的鎖信息,剛好昨天有時間我就來研究一下。 二:Monitor.Wait 底層怎麼玩的 1. 案例演示 為了方便講述,先 ...
  • 目錄前言學習參考過程總結: 前言 做個自由仔。 學習參考 ChatGpt; https://www.cnblogs.com/zhili/p/DesignPatternSummery.html(大佬的,看了好多次) 過程 原由: 一開始只是想查查鏈式調用原理,以為是要繼承什麼介面,實現什麼方法才可以實 ...