標籤:ati 代碼 ref 檔案中 自動化工具 產生 gate 類庫 全面
C#3.0一些新特性
class A<T> where T:new()
這是型別參數約束,where表名了對類型變數T的約束關係。where T:A 表示類型變數是繼承於A的,或者是A本省。where T: new()指明了建立T的執行個體應該使用的建構函式。
.NET支援的型別參數約束有以下五種:
where T: struct T必須是一個結構類型
where T: class T必須是一個類(class)類型,不是結構(structure)類型
where T: new() T必須要有一個無參建構函式
where T: NameOfBaseClass T必須繼承名為NameOfBaseClass的類
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(向方法傳遞的參數);
View Code
下面是一些需要注意的事情:“代理”(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 的平方值。
C#之Lambda不得不說的用法C# Lambda運算式
Action 與 Func是.NET類庫中增加的內建委託
C#之Action和Func的用法委託小結及Func用法C#:Func的同步、非同步呼叫
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
Language-integrated Query (LINQ) (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中引入的一項創新功能。
在 Visual Studio 中,可以為以下資料來源編寫 LINQ 查詢:SQL Server 資料庫、XML 文檔、ADO.NET 資料集,以及支援 IEnumerable 或泛型 IEnumerable<T> 介面的任意對象集合。 使用要求:項目 ≥ .NET Framework 3.5 。走進 LINQ 的世界
c#文法