C#.Net 擴充方法

來源:互聯網
上載者:User

一看懂學會這個方法, 就讓我大吃一驚, 不禁擊案而起,還能這麼幹, 現在我們能直接擴充string類,object類,乃至第三方你拿不到原始碼的類了,這簡直是把剛入職的新人一步抬上董事長的位置上去, 把剛入論壇的新手直接提升為管理員, 什麼都能幹了, 太歲頭上也能動土了, 老虎屁股也能摸了, 而且還是編譯時間的文法糖, 效能高不用擔心效率問題,不得不說,ms的牛人雖然推技術快如颳風,不過,他們確實還回回想到別人心坎上去,沒辦法,還是原創國獨領電腦領域風騷啊!別國只能跟風學習膜拜了。

 

罈子裡已經有好多牛人的詳細介紹了,下面標記幾篇:

鶴衝天的c# 擴充方法奇思妙用
http://www.cnblogs.com/ldp615/archive/2009/08/07/1541404.html

淺析C#擴充方法
http://developer.51cto.com/art/200908/143036.htm

.NET3.0之擴充方法
http://www.cnblogs.com/aspnethot/articles/1385144.html

 

下面援引".NET3.0之擴充方法"一文, 我就拿來主義懶得了:

MSDN對擴充方法的定義: 擴充方法使你能夠向現有類型“添加”方法(包括你自訂的類),而無需建立新的衍生類別型、重新編譯或以其他方式修改原始類型。擴充方法是一種特殊的靜態方法,但是可以像擴充類型上的執行個體方法一樣進行調用。對於用C#編寫的用戶端代碼,調用擴充方法與調用在類型中實際定義的方法之間沒有明顯的差異。

LINQ標準查詢運算子就是採用的擴充方法方式,見

    (當我們看到下“小標箭頭”的方法就是擴充方法了,這裡我們看到OrderBy亦是擴充方法)

 

看到這裡也就是說,擴充方法是為Linq鋪路的,是因為要推出Linq才得以享受到擴充方法。

好歸好,一定要慎用,不然,一不小心就會汙染大面積類的。

 

別光說不練,自己也寫一段,看看裡面是啥玩藝:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            string abc = "lzd";
            abc.ShowLzdInfo();
            Console.ReadKey();           
        }       
    }

    public static class LzdTools
    {
        public static void ShowLzdInfo(this object s)
        {
            Console.WriteLine(s);
        }
    }
}

 

然後反編譯,查查老底:

 

.method public hidebysig static void  ShowLzdInfo(string s) cil managed
{
  .custom instance void [System.Core]System.Runtime.CompilerServices.ExtensionAttribute::.ctor() = ( 01 00 00 00 )
  // Code size       9 (0x9)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0007:  nop
  IL_0008:  ret
} // end of method LzdTools::ShowLzdInfo

 

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       21 (0x15)
  .maxstack  1
  .locals init ([0] string abc)
  IL_0000:  nop
  IL_0001:  ldstr      "lzd"
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  call       void ConsoleApplication6.LzdTools::ShowLzdInfo(string)
  IL_000d:  nop
  IL_000e:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
  IL_0013:  pop
  IL_0014:  ret
} // end of method Program::Main

 

原來是給這個方法加了ExtensionAttribute的屬性,編譯時間會根據這個屬性來尋找擴充方法,然後對號入座。

等到執行時,再替換回原方法ConsoleApplication6.LzdTools::ShowLzdInfo(string)。

幹得真是漂亮,給程式員尊嚴,還不破壞語言的原則。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.