bootstrap手冊數據庫
class A<T> where T:new()express
這是類型參數約束,where表名了對類型變量T的約束關係。where T:A 表示類型變量是繼承於A的,或者是A本省。where T: new()指明瞭建立T的實例應該使用的構造函數。bootstrap
.NET支持的類型參數約束有如下五種:c#
where T: struct T必須是一個結構類型設計模式
where T: class T必須是一個類(class)類型,不是結構(structure)類型安全
where T: new() T必需要有一個無參構造函數異步
where T: NameOfBaseClass T必須繼承名爲NameOfBaseClass的類ide
where T: NameOfInterface T必須實現名爲NameOfInterface的接口函數
CallContext 是相似於方法調用的線程本地存儲區的專用集合對象
提供對每一個邏輯執行線程都惟一的數據槽。數據槽不在其餘邏輯線程上的調用上下文之間共享。當 CallContext 沿執行代碼路徑往返傳播而且由該路徑中的各個對象檢查時,可將對象添加到其中。
也就是說,當前線程對對象進行儲存到線程本地儲存區,對象隨着線程的銷燬而銷燬。
一個對象保證全局惟一,確定會想到一個經典的設計模式:單例模式,數據槽:CallContext:使用的對象是線程內惟一
委託
相似於C++中的函數指針,由於C#中不存在指針,因此用委託能夠完成一些原來在C++中用函數指針完成的操做,例如傳遞一個類A的方法m給另外一個類B的對象,使得類B的對象可以調用這個方法m。
實現一個委託是很簡單的,經過如下3個步驟便可實現一個delegate: 1.聲明一個delegate對象,它應當與你想要傳遞的方法具備相同的參數和返回值類型。 聲明一個代理的例子: public delegate int MyDelegate(string message); 2.建立delegate對象,並將你想要傳遞的函數做爲參數傳入。 建立代理對象的方法: 1). MyDelegate myDelegate = new MyDelegate(實例名.方法名); 2). MyDelegate myDelegate = new MyDelegate(類名.方法名); 注:若是須要代理的方法是一個static靜態方法的話,採用第2種方式,不然採用第1種方式。 3.在要實現異步調用的地方,經過上一步建立的對象來調用方法。 能夠直接使用代理調用代理所指向的方法: myDelegate(向方法傳遞的參數);
下面是一些須要注意的事情: 「代理」(delegate)(表明、委託):「委託」是類型安全的而且徹底面向對象的。 (1)在C#中,全部的委託都是從System.Delegate類派生的(delegate是System.Delegate的別名)。 (2)委託隱含具備sealed屬性,即不能用來派生新的類型。 (3)委託最大的做用就是爲類的事件綁定事件處理程序。 (4)在經過委託調用函數前,必須先檢查代理是否爲空(null),若非空,才能調用函數。 (5)在委託實例中能夠封裝靜態的方法也能夠封裝實例方法。 (6)在建立委託實例時,須要傳遞將要映射的方法或其餘委託實例以指明委託將要封裝的函數原型(.NET中稱爲方法簽名:signature)。注意,若是映射的是靜態方法,傳遞的參數應該是類名.方法名,若是映射的是實例方法,傳遞的參數應該是實例名.方法名。 (7)只有當兩個委託實例所映射的方法以及該方法所屬的對象都相同時,才認爲它們是想等的(從函數地址考慮)。 (8)多個委託實例能夠造成一個委託鏈,System.Delegate中定義了用來維護委託鏈的靜態方法Combion,Remove,分別向委託鏈中添加委託實例和刪除委託實例。 (9)委託三步曲: a.生成自定義委託類:delegate int MyDelegate(); b.而後實例化委託類:MyDelegate d = new MyDelegate(MyClass.MyMethod); c.最後經過實例對象調用方法:int ret = d();
Lambda 表達式:Lambda 表達式是一種可用於建立委託或表達式目錄樹的匿名函數
在 2.0 以前的 C# 版本中,聲明委託的惟一方法是使用命名方法。 C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表達式取代了匿名方法,做爲編寫內聯代碼的首選方式。
若要建立 Lambda 表達式,須要在 Lambda 運算符 => 左側指定輸入參數(若是有),而後在另外一側輸入表達式或語句塊。 例如,lambda 表達式 x => x * x 指定名爲 x 的參數並返回 x 的平方值。
Action 與 Func是.NET類庫中增長的內置委託
1:Action用於沒有返回值的方法(參數能夠根據本身狀況進行傳遞)
2:Func偏偏相反用於有返回值的方法(一樣參數根據本身狀況狀況)
3:無返回用action,有返回用Func
partial C# 2.0 引入了局部類型的概念
局部類型容許咱們將一個類、結構或接口分紅幾個部分,分別實如今幾個不一樣的.cs文件中。
局部類型適用於如下狀況: (1) 類型特別大,不宜放在一個文件中實現。 (2) 一個類型中的一部分代碼爲自動化工具生成的代碼,不宜與咱們本身編寫的代碼混合在一塊兒。 (3) 須要多人合做編寫一個類。 2. 局部類型的限制 (1) 局部類型只適用於類、接口、結構,不支持委託和枚舉。 (2) 同一個類型的各個部分必須都有修飾符 partial。 (3) 使用局部類型時,一個類型的各個部分必須位於相同的命名空間中。 (4) 一個類型的各個部分必須被同時編譯。 3. 局部類型的注意點 (1) 關鍵字partial是一個上下文關鍵字,只有和 class、struct、interface 放在一塊兒時纔有關鍵字的含義。所以partial的引入不會影響現有代碼中名稱爲partial的變量。 (2) 局部類型的各個部分通常是分開放在幾個不一樣的.cs文件中,但C#編譯器容許咱們將他們放在同一文件中。 4. 局部類型的應用特性 在局部類型上的特性具備「累加」效應。 [Attribute1, Attribute2("Hello")] partial class Class1{} [Attribute3, Attribute2("Exit")] partial class Class1{} 至關於 [Attribute1, Attribute2("Hello"), Attribute3, Attribute2("Exit")] class Class1 {} 注:Attribute2屬性容許在類上屢次使用。 5. 局部類型上的修飾符 (1) 一個類型的各個部分上的訪問修飾符必須維持一致性。 (2) 若是一個部分類使用了abstract修飾符,那麼整個類都將被視爲抽象類。 (3) 若是一個部分類使用了 sealed 修飾符,那麼整個類都將被視爲密封類。 (4) 一個類的各個部分不能使用相互矛盾的修飾符,好比不能在一個部分上使用abstract,又在另外一個部分上使用sealed。 (5)若是一個部分類使用了 static修飾符,那麼整個類都將被視爲靜態類。 6. 局部類型的基類和接口 (1) 一個類型的各個部分上指定的基類必須一致。某個部分能夠不指定基類,但若是指定,則必須相同。 (2) 局部類型上的接口具備「累加」效應。 partial class Class2: Iinterface1, Iinterface2 {} partial class Class2: Iinterface3 {} partial class Class2: Iinterface2 {} 至關於 class Class2: Iinterface1, Iinterface2, Iinterface3 {}
Link
語言集成查詢 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中引入的一項創新功能。