1. 程式人生 > >c#語法

c#語法

不同的 當前 base 使用 move 事情 指針 func 多人合作

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

語言集成查詢 (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#語法