<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何使用 C# 擴(kuò)展方法

          共 2170字,需瀏覽 5分鐘

           ·

          2020-11-28 20:19

          譯文鏈接:https://www.infoworld.com/article/3130492/how-to-work-with-extension-methods-in-c.html

          C# 在 3.0 版本中提供了對(duì) 擴(kuò)展方法 的支持,擴(kuò)展方法常用于給一個(gè)已存在的類添加新的方法從而擴(kuò)展該類的功能,最關(guān)鍵的是:你不需要在現(xiàn)存類中派生一個(gè)子類,你也不需要破壞性的修改類的現(xiàn)有代碼骨架,更談不上重新編譯了,擴(kuò)展方法能夠提供代碼可讀性的同時(shí)又可以擴(kuò)展類的功能。

          .NET 框架中最常見的擴(kuò)展方法包括 Linq 標(biāo)準(zhǔn)的查詢操作,這類擴(kuò)展方法極大的擴(kuò)展了System.Collections.IEnumerable 和 System.Collections.Generic.IEnumerable 的查詢能力,如下圖:

          現(xiàn)在你明白了擴(kuò)展方法,你可以用這項(xiàng)技術(shù)去給已存在的 class 或者 interface 添加更多實(shí)用方法而不應(yīng)該從子類中新增額外的方法,MSDN上說:擴(kuò)展方法允許你給現(xiàn)有的類 添加 方法,而不需要你生成子類,重新編譯,或者任何其他形式的修改原有類,擴(kuò)展方法是一種特殊的靜態(tài)方法,當(dāng)你調(diào)用它的時(shí)候就好像它就是你擴(kuò)展類的原生方法。

          本質(zhì)上來說,擴(kuò)展方法也算是一種特殊的靜態(tài)方法,它允許你給已存在的類添加新的方法即使你沒有權(quán)限訪問這個(gè)擴(kuò)展類的源代碼,擴(kuò)展方法除了簽名中的第一個(gè)參數(shù)是 this 之外就和靜態(tài)方法是一模一樣,你可以給任何一個(gè)類添加任意多的擴(kuò)展方法,更??的是:這個(gè)擴(kuò)展方法特性還可以作用到值類型之上。

          當(dāng)你使用擴(kuò)展方法的時(shí)候,請(qǐng)記住下面的幾個(gè)點(diǎn):

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

          • 擴(kuò)展方法必須在 static class 內(nèi),類的名字無所謂

          • 擴(kuò)展方法的第一個(gè)參數(shù)一定是 this,后面跟上你需要擴(kuò)展的類型

          有一點(diǎn)要特別注意,如果擴(kuò)展方法的名字和你要擴(kuò)展類中的某一個(gè)方法重名了,那么你的擴(kuò)展方法將會(huì)失效,永遠(yuǎn)也不會(huì)被調(diào)用。

          使用 C# 擴(kuò)展方法

          這一節(jié)中我們一起探討下如何使用 C# 來實(shí)現(xiàn)一個(gè)擴(kuò)展方法,下面的代碼清單展示了 C# 中的擴(kuò)展方法到底長(zhǎng)成什么樣?


          ????public?static?class?StringExtensions
          ????{
          ????????public?static?bool?IsNumeric(this?string?str)
          ????????{
          ????????????double?output;
          ????????????return?double.TryParse(str,?out?output);
          ????????}
          ????}

          請(qǐng)注意擴(kuò)展方法中的第一個(gè)參數(shù),正如之前討論過的,任何擴(kuò)展方法都必須是靜態(tài)的,而且在參數(shù)之前還要申明一下 this 關(guān)鍵詞,比如像上面這個(gè)例子一樣,相當(dāng)于告訴了編譯器你已經(jīng)在 string 類上擴(kuò)展了一個(gè) IsNumeric 方法。

          接下來一起看一下如何在 string 類中使用 IsNumeric 方法。


          ????????static?void?Main(string[]?args)
          ????????{
          ????????????string?str?=?"100";

          ????????????if?(str.IsNumeric())?Console.WriteLine("The?string?object?named?str?contains?numeric?value.");

          ????????????Console.Read();
          ????????}

          當(dāng)你執(zhí)行完上面這段程序,會(huì)在控制臺(tái)輸出:The string object named str contains numeric value。

          你可以使用擴(kuò)展方法這門技術(shù)通過向類添加方法的形式增強(qiáng)類的功能,而不需要修改,派生或者重新編譯原來的類型,正如之前我提到的,擴(kuò)展方法也可以應(yīng)用于值類型之上,接下來我通過一個(gè)例子來驗(yàn)證下這是如何實(shí)現(xiàn)的。

          下面我定義了一個(gè) IntegerExtensions 類,里面有一個(gè) IsEven 擴(kuò)展方法,當(dāng)輸入的參數(shù)是偶數(shù)的話,這個(gè)方法會(huì)返回 true,否則返回 false。


          ????public?static?class?IntegerExtensions
          ????{
          ????????public?static?bool?IsEven(this?int?i)
          ????????{
          ????????????return?((i?%?2)?==?0);
          ????????}
          ????}

          接下來的代碼將會(huì)展示如何在 integer 類型上調(diào)用這個(gè)擴(kuò)展方法。


          ????????static?void?Main(string[]?args)
          ????????{
          ????????????int?n?=?2;

          ????????????if?(n.IsEven())?Console.WriteLine("The?value?of?the?integer?is?even.");
          ????????}


          瀏覽 121
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  夜夜骚av| 欧美A片免费在线观看 | 开心五月丁香五月 | 黄色福利 | 操比免费视频 |