展開(kāi)
湖北國(guó)聯(lián)計(jì)算機(jī)科技有限公司
  • 首頁(yè)HOME
  • 公司簡(jiǎn)介INTRODUCTION
  • 安全防御DEFENSE
  • 軟件開(kāi)發(fā)SOFTWARE
  • 物聯(lián)網(wǎng)IOT
  • 運(yùn)行維護(hù)SRE
  • 成功案例CASE
  • 聯(lián)系我們CONTACT
  • Software Technology Sharing |技術(shù)分享

    C#中的擴(kuò)展方法
    來(lái)源:荊州網(wǎng)站建設(shè) 時(shí)間:2017-05-21

    在java中沒(méi)有這樣的東西,一個(gè)類(lèi)一旦是 final的,這個(gè)類(lèi)就不能再被添加方法,但是C#能夠做到,可以給 sealed 類(lèi)添加新的方法,這點(diǎn)我還是比較喜歡c#的。

    這就是C#中的擴(kuò)展方法。

    那么什么情況下我們才需要去給一個(gè)類(lèi)寫(xiě)擴(kuò)展方法呢?

    系統(tǒng)自帶的類(lèi)型,我們無(wú)法去修改;

    修改源代碼需要較大的精力,而且可能會(huì)帶來(lái)錯(cuò)誤;

    我們只是需要一個(gè)或者較少的幾個(gè)方法,修改源代碼費(fèi)時(shí)費(fèi)力;

    被擴(kuò)展的類(lèi)是sealed的,不能被繼承;(就算不是sealed的,我們也不能因?yàn)樾枰粋€(gè)方法而去寫(xiě)一個(gè)子類(lèi),這樣不是面向?qū)ο螅?/p>

    下面是擴(kuò)展方法的三個(gè)要素:(也算是語(yǔ)法規(guī)則)

    擴(kuò)展方法必須處于一個(gè)靜態(tài)類(lèi)中;

    擴(kuò)展方法必須是一個(gè)靜態(tài)方法;

    擴(kuò)展方法的參數(shù)列表必須以 this 開(kāi)頭,this 后面緊跟的是被擴(kuò)展類(lèi),然后才是方法需要的參數(shù);

    下面就舉一個(gè)栗子:

    我們一般將字符串類(lèi)型的數(shù)字轉(zhuǎn)換為int類(lèi)型,一般都是用的 int.Parse() 方法,或者 Convert類(lèi)的方法,我們能不能給 string 類(lèi)型添加一個(gè) Parse方法呢?

    當(dāng)然是可以的,代碼上來(lái)先:(這里只寫(xiě)了無(wú)參數(shù)的擴(kuò)展方法,有參數(shù)的直接在參數(shù)列表中添加即可,調(diào)用時(shí)傳遞對(duì)應(yīng)參數(shù))

    using System;

    namespace ConsoleApplicationTest

    {

    public static class stringExtensionMethod

    {

    public static int Parse(this string str)

    {

    return int.Parse(str);

    }

    }

    class Program

    {

    static void Main(string[] args)

    {

    string str = "111";

    int i = str.Parse();

    Console.WriteLine("i: " + i);

    }

    }

    }

    復(fù)制代碼

    有一點(diǎn)可能不好理解,為什么參數(shù)列表里面有參數(shù),但是在調(diào)用的時(shí)候卻不傳遞參數(shù),對(duì)于這點(diǎn)我之前也是有點(diǎn)迷糊,但是想通了就好了,那里不是有個(gè) this 關(guān)鍵字嗎?this指代的就是當(dāng)前對(duì)象嘛,也就是被擴(kuò)展類(lèi)的實(shí)例,也就是擴(kuò)展方法的調(diào)用者,既然是調(diào)用者,那還把它當(dāng)參數(shù)傳,肯定不傳呀。

    下面寫(xiě)一下擴(kuò)展方法的特點(diǎn):

    1、this關(guān)鍵字緊跟著的不是參數(shù),而是調(diào)用者,調(diào)用者后面的參數(shù)才是擴(kuò)展方法真正的參數(shù),在調(diào)用時(shí)必須傳遞;

    2、如果被擴(kuò)展的類(lèi)中的實(shí)例方法和擴(kuò)展方法的方法簽名相同(擴(kuò)展方法中方法的簽名應(yīng)該要去掉this和調(diào)用者參數(shù)),則優(yōu)先調(diào)用本類(lèi)中的實(shí)例方法;

    3、被擴(kuò)展類(lèi)(可以是普通類(lèi),也可以是接口抽象類(lèi))的子類(lèi)對(duì)象可以直接調(diào)用父類(lèi)的擴(kuò)展方法,也就是說(shuō)子類(lèi)也繼承了父類(lèi)的擴(kuò)展方法;

    4、這點(diǎn)算是第 3 點(diǎn)的補(bǔ)充,只有被擴(kuò)展類(lèi)的本類(lèi)對(duì)象或者子類(lèi)對(duì)象,才能調(diào)用擴(kuò)展方法;



    以上由湖北國(guó)菱荊州軟件開(kāi)發(fā)、荊州網(wǎng)站建設(shè)工程師整理發(fā)布。喜歡程序開(kāi)發(fā)的伙伴們歡迎一起交流探討。Email:business@gl-ns.com,電話:0716-6666211.

    荊州地區(qū)政府網(wǎng)站建設(shè) 解決方案 專(zhuān)業(yè)團(tuán)隊(duì) 騰訊第三方平臺(tái) 地址:湖北省荊州市沙市區(qū)荊沙大道楚天都市佳園一期C區(qū)29棟112       地址:湖北省松滋市新江口街道才知文化廣場(chǎng)1幢1146-1151室     郵編:434200 聯(lián)系電話:0716-6666211     網(wǎng)站編輯部郵箱:business@gl-ns.com 鄂公網(wǎng)安備 42100202000212號(hào) 備案號(hào):鄂ICP備2021015094號(hào)-1     企業(yè)名稱(chēng):湖北國(guó)菱計(jì)算機(jī)科技有限公司