一看懂學會這個方法, 就讓我大吃一驚, 不禁擊案而起,還能這麼幹, 現在我們能直接擴充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)。
幹得真是漂亮,給程式員尊嚴,還不破壞語言的原則。