柚子快報(bào)激活碼778899分享:C#之?dāng)U展方法詳解
柚子快報(bào)激活碼778899分享:C#之?dāng)U展方法詳解
前言:
我們想要向一個類型中添加方法,可以通過以下兩種方式:
1.修改源代碼。
2.在派生類中定義新的方法。
但是這兩種方式都有缺點(diǎn),1如果是別人的代碼,你對其直接進(jìn)行修改,可能破壞代碼的完整性,使代碼無法編譯,2會增加代碼的維護(hù)成本,修改功能時父類子類可能都要修改
1.擴(kuò)展方法概述和基本準(zhǔn)則
(1).C#只支持?jǐn)U展方法,不支持?jǐn)U展屬性、擴(kuò)展事件、擴(kuò)展操作符等。
?(2).擴(kuò)展方法(第一個參數(shù)前面是this的方法)必須在非泛型的靜態(tài)類中聲明,擴(kuò)展方法必須有一個參數(shù),而且只有第一個參數(shù)使用this標(biāo)記。
?(3).用一個擴(kuò)展方法擴(kuò)展一個類型時,同時也擴(kuò)展了派生類型。?
2.擴(kuò)展方法應(yīng)用
namespace HelloWorld//命名空間
{
public class Student
{
public void FunctionA()
{
Console.WriteLine("我是方法A");
}
}
public static class Extension
{
public static void FunctionB(this Student myStudent, int a)
{
Console.WriteLine("我是Student類的擴(kuò)展方法B,參數(shù)是" + a);
}
}
class ExtMethodDemo
{
static void Main(string[] args)
{
Student a=new Student();
a.FunctionB(5);
}
}
}
打印結(jié)果:
擴(kuò)展方法擴(kuò)展的不僅僅可以是引用類型,也可以是值類型,附帶一個官方的例子
3.擴(kuò)展方法本質(zhì)
?????????“擴(kuò)展方法”是C#獨(dú)有的一種方法,在擴(kuò)展方法中會使用ExtensionAttribute這個attribute。
????????C#一旦使用this關(guān)鍵字標(biāo)記了某個靜態(tài)方法的第一個參數(shù),編譯器就會在內(nèi)部向該方法應(yīng)用一個定制的attribute,這個attribute會在最終生成的文件的元數(shù)據(jù)中持久性的存儲下來,此屬性在System.Core dll程序集中。
????????任何靜態(tài)類只要包含了至少一個擴(kuò)展方法,它的元數(shù)據(jù)中也會應(yīng)用這個attribute,任何一個程序集包含了至少一個符合上述特點(diǎn)的靜態(tài)類,它的元數(shù)據(jù)也會應(yīng)用這個attribute。如果代碼用了一個不存在的實(shí)例方法,編譯器會快速的掃描引用的所有程序集,判斷它們哪些包含了擴(kuò)展方法,然后,在這個程序集中,可以掃描包含了擴(kuò)展方法的靜態(tài)類。
????????如果同一個命名空間中的兩個類含有擴(kuò)展類型相同的方法,就沒有辦法做到只用其中一個類中的擴(kuò)展方法。為了通過類型的簡單名稱(沒有命名空間前綴)來使用類型,可以導(dǎo)入該類型所有在的命名空間,但這樣做的時候,你沒有辦法阻止那個命名空間中的擴(kuò)展方法也被導(dǎo)入進(jìn)來。
就比如說:
當(dāng)編譯看到以上述代碼,編譯器分兩步工作:
(1) 編譯器檢查a當(dāng)前類型,也就是Student類以及Student任何基類是否具有所匹配的名為FunctionB包含一個int參數(shù)的函數(shù),如果找到,則生成IL代碼并Call它;
(2)?如果沒有找到匹配的方法,就繼續(xù)檢查是否有任何靜態(tài)類定義了名為FunctionB的靜態(tài)方法,并且這個方法必須第一個參數(shù)是用this關(guān)鍵字修飾,參數(shù)類型為Student的。找到時生成相應(yīng)的IL代碼來調(diào)用它。
? ? ? ? 所以也解釋了為什么擴(kuò)展類必須是靜態(tài)非泛型的,因?yàn)槟惚仨毐WC在編譯階段,Student能找到它匹配的方法,而泛型是在程序運(yùn)行時才能確定方法。
官方文檔鏈接:擴(kuò)展方法 - C# 編程指南 - C# | Microsoft Learn
參考鏈接:https://www.cnblogs.com/yuer20180726/p/10901123.html
柚子快報(bào)激活碼778899分享:C#之?dāng)U展方法詳解
文章鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。