Func<[...,]T> 最後一個參數為返回值類型,其他的為方法參數類型,相當於:T function([...]){return T的實例;}
Action<[T,...]> T為參數類型,相當於void function([T,...]){}
Predicate<[T,...]> T為參數類型,相當於 bool function([T,...]){return true或false;}
以上是系統定義的泛型委托,這些委托跟Lambda表達式結合,靈活的實現各種功能。
上面的代碼檢查IL可看到生成了以下方法:
.method private hidebysig static string '<Main>b__0'() cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 11 (0xb)
.maxstack 1
.locals init ([0] string CS$1$0000)
IL_0000: nop
IL_0001: ldstr "abc"
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000a: ret
} // end of method Program::'<Main>b__0'
擴展方法(Extension Methods)
有點類似於JavaScript的prototype。
在不改變原類型的基礎上擴展原類型。
當擴展方法的方法簽名與原類型的方法沖突時,原類型自身方法優先。
擴展方法不能訪問原類型的受保護的字段等等。
擴展方法可以對類及接口進行擴展。
.NET 3.X基礎代碼仍然是.Net 2.0的代碼,用擴展方法對其擴展了很多功能,如對List<T>的擴展增加了很多功能。
示例:
public class Test1
{
public string String1 { set; get; }
public int Int1 { set; get; }
}
public static class Test2
{
/*
* 實現擴展方法的類及擴展的方法都必須是靜態的,待擴展的類作為參數,前面加this關鍵字
*/
public static string AddDefaultPage(this Test1 t)
{
return t.String1 + "/Default.ASPx";
}
}
var t4 = new Test1 { String1 = "http://xianfen.Net", Int1 = 0 };
t4.AddDefaultPage();
IL對擴展方法的聲明及調用
.method public hidebysig static string AddDefaultPage(class CS30NEW.Test1 t) cil managed
call string CS30NEW.Test2::AddDefaultPage(class CS30NEW.Test1)
查詢語法(Query Syntax)
查詢語法是Linq的核心,後面詳細介紹。
這些新特性對CLR及IL相對與.NET2.0沒有任何改變,編譯器替開發人員做了相當多的工作,大大減少了編碼量,以便使開發人員專注與邏輯的實現,難怪安裝了.Net 3.X,運行Visual studio 2008命令提示行的clrver命令,顯示的是2.0.XXX。