面向?qū)ο螅ㄊ牛?擴展方法

1 簡介:

擴展方法使你能夠向現(xiàn)有類型“添加”方法呻畸,而無需創(chuàng)建新的派生類型写穴、重新編譯或以其他方式修改原始類型玄组。 擴展方法是一種特殊的靜態(tài)方法整以,但可以像擴展類型上的實例方法一樣進行調(diào)用胧辽。

2.定于擴展方法

Personl類的定義

public class Person
    {
        public string name;

        public override string ToString()
        {
            return this.name;
        }
    }

為Person類擴展方法

public static class MethedExt
    {
        public static void sayHellow(this Person obj)
        {
            Console.WriteLine("Say Hellow" + obj.name);
        }
    }

擴展方法被定義為靜態(tài)方法,但它們是通過實例方法語法進行調(diào)用的公黑。 它們的第一個參數(shù)指定該方法作用于哪個類型邑商,并且該參數(shù)以 this 修飾符為前綴。

3. 調(diào)用擴展方法

            Person p1 = new Person();
            p1.name = "asdasd";
            p1.sayHellow();

在代碼中凡蚜,可以使用實例方法語法調(diào)用該擴展方法人断。 但是,編譯器生成的中間語言 (IL) 會將代碼轉(zhuǎn)換為對靜態(tài)方法的調(diào)用朝蜘。 因此恶迈,并未真正違反封裝原則。 實際上谱醇,擴展方法無法訪問它們所擴展的類型中的私有變量暇仲。

定義和調(diào)用擴展方法注意點

  • 定義一個靜態(tài)類以包含擴展方法。

  • 將該擴展方法實現(xiàn)為靜態(tài)方法副渴,并使其至少具有與包含類相同的可見性奈附。

  • 該方法的第一個參數(shù)指定方法所操作的類型;該參數(shù)必須以 this修飾符開頭煮剧。

  • 在調(diào)用代碼中斥滤,添加一條 using指令以指定包含擴展方法類的命名空間。

  • 按照與調(diào)用類型上的實例方法一樣的方式調(diào)用擴展方法勉盅。

4 為接口添加擴展方法

接口定義

  public interface Interface1
    {
        void test1();

    }

為接口擴展方法

public static class MethedExt
    {
        public static void test2(this Interface1 iter)
        {
            Console.WriteLine("test2");
        }
     }

實現(xiàn)接口中的方法

public class Person : Interface1
    {
        public string name;
        private int age;

        public override string ToString()
        {
            return this.name;
        }

        public void test1()
        {

        }
    }

調(diào)用擴展的接口方法

static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.name = "asdasd";
            p1.test2();
        }

5佑颇、使用注意

可以使用擴展方法來擴展類或接口,但不能重寫擴展方法草娜。
與接口或類方法具有相同名稱和簽名的擴展方法永遠不會被調(diào)用挑胸。
編譯時,擴展方法的優(yōu)先級總是比類型本身中定義的實例方法低宰闰。 換句話說嗜暴,如果某個類型具有一個名為 SayHellow()的方法,而你有一個具有相同簽名的擴展方法议蟆,則編譯器總是綁定到該實例方法闷沥。 當編譯器遇到方法調(diào)用時,它首先在該類型的實例方法中尋找匹配的方法咐容。 如果未找到任何匹配方法舆逃,編譯器將搜索為該類型定義的任何擴展方法,并且綁定到它找到的第一個擴展方法。

牢記一點: 如果擴展方法與該類型中定義的方法具有相同的簽名路狮,則擴展方法永遠不會被調(diào)用虫啥。

6、一點建議:

通常奄妨,建議你只在不得已的情況下才實現(xiàn)擴展方法涂籽,并謹慎地實現(xiàn)。 只要有可能砸抛,必須擴展現(xiàn)有類型的客戶端代碼都應該通過創(chuàng)建從現(xiàn)有類型派生的新類型來達到這一目的评雌。
在使用擴展方法來擴展你無法更改其源代碼的類型時,你需要承受該類型實現(xiàn)中的更改會導致擴展方法失效的風險直焙。

作者:silence_k
鏈接:http://www.reibang.com/p/247ab6b373a4
來源:簡書
著作權(quán)歸作者所有景东。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處奔誓。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斤吐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厨喂,更是在濱河造成了極大的恐慌和措,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜕煌,死亡現(xiàn)場離奇詭異派阱,居然都是意外死亡,警方通過查閱死者的電腦和手機幌绍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來故响,“玉大人傀广,你說我怎么就攤上這事〔式欤” “怎么了伪冰?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長樟蠕。 經(jīng)常有香客問我贮聂,道長,這世上最難降的妖魔是什么寨辩? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任吓懈,我火速辦了婚禮,結(jié)果婚禮上靡狞,老公的妹妹穿的比我還像新娘耻警。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布甘穿。 她就那樣靜靜地躺著腮恩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪温兼。 梳的紋絲不亂的頭發(fā)上秸滴,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音募判,去河邊找鬼荡含。 笑死,一個胖子當著我的面吹牛兰伤,可吹牛的內(nèi)容都是我干的内颗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼敦腔,長吁一口氣:“原來是場噩夢啊……” “哼均澳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起符衔,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤找前,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后判族,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躺盛,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年形帮,在試婚紗的時候發(fā)現(xiàn)自己被綠了槽惫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡辩撑,死狀恐怖界斜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情合冀,我是刑警寧澤各薇,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站君躺,受9級特大地震影響峭判,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棕叫,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一林螃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俺泣,春花似錦治宣、人聲如沸急侥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坏怪。三九已至,卻和暖如春绊茧,著一層夾襖步出監(jiān)牢的瞬間铝宵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工华畏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鹏秋,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓亡笑,卻偏偏與公主長得像侣夷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仑乌,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,930評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理百拓,服務(wù)發(fā)現(xiàn),斷路器晰甚,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法衙传,類相關(guān)的語法,內(nèi)部類的語法厕九,繼承相關(guān)的語法蓖捶,異常的語法,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 一:java概述:1扁远,JDK:Java Development Kit俊鱼,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,635評論 0 11
  • 深夜聽了Something Just Like This畅买。評論區(qū)里熱鬧非凡并闲,有人對歌詞大發(fā)感慨:我不需要超級能...
    游槡閱讀 254評論 0 1