程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Linq學習(2) .NET 3.X新特性回顧(5)

Linq學習(2) .NET 3.X新特性回顧(5)

編輯:關於C語言

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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved