C# 參考之上下文關鍵字get、set、value、partial、where和yield
上下文關鍵字用於提供代碼中的特定含義,但它不是 C# 中的保留字。
get、set、value
get 在屬性或索引器中定義“訪問器”方法,以檢索該屬性或該索引器元素的值。
set 義屬性或索引器中的“訪問器”方法,用於設置屬性或索引器元素的值。
value 隱式參數,用於設置訪問器以及添加或移除事件處理程序。
// 簡單示例
class Employee
{
privatestring _name;
publicstring Name
{
get { returnthis._name; }
set { this._name = value; }
}
}
注意:
get、set“訪問器”,在默認情況下具有相同的訪問級別。但是有時鑑於對讀寫的考慮,通常可以限制set的訪問級別。對屬性或索引器使用訪問修飾符受以下條件的制約:
不能對接口或顯式接口成員實現使用訪問器修飾符。
僅當屬性或索引器同時具有 set 和 get 訪問器時,才能使用訪問器修飾符。這種情況下,只允許對其中一個訪問器使用修飾符。
如果屬性或索引器具有 override 修飾符,則訪問器修飾符必須與重寫的訪問器的訪問器(如果有的話)匹配。
訪問器的可訪問性級別必須比屬性或索引器本身的可訪問性級別具有更嚴格的限制。
partial
partial 分部類型定義允許將類、結構或接口的定義拆分到多個文件中。
[modifiers] partial type
modifiers是可選的。可以是abstract、new、override、static、virtual、extern,以及訪問修飾符中的一個。
type 可以是類、結構和接口之一。
示例:
以下的部分類在編譯時,將會合並,包括它的方法、類型特性等等。
1namespace Hunts.Keywords 2{ 3 [System.Serializable] 4partialclass Test 5 { 6void Test1() { } 7 } 8 [Conditional("DEBUG")] 9partialclass Test10 {11void Test2() { }12 }13}類相當於:
1namespace Hunts.Keywords 2{ 3 [System.Serializable] 4 [Conditional("DEBUG")] 5class Test 6 { 7void Test1() { } 8void Test2() { } 9 }10}
關於部分(類、接口、結構)的詳細使用,可以參閱MSDN Library中的部分類。
where
where 子句用於指定類型約束,這些約束可以作爲泛型聲明中定義的類型參數的變量。
之所以使用類型約束是因爲如果要檢查泛型列表中的某個項以確定它是否有效,或者將它與其他某個項進行比較,則編譯器必須在一定程度上保證它需要調用的運算符或方法將受到客戶端代碼可能指定的任何類型參數的支持。這種保證是通過對泛型類定義應用一個或多個約束獲得的。
// 句法publicclass MyGenericClass<T>where T:something
something可以是:結構、類、new()、<基類名>或<接口名稱>。
可以同時具有1中的多個約束,且約束自身也可以是泛型類型。
也可以將約束作用於泛型方法或委託。
要更深入的瞭解可以參閱MSDN Library中的“泛型編程”以及“類型參數的約束”這些內容。
示例:
1// keywords_where.cs 2 3using System; 4using System.Collections; 5 6struct MyStruct 7{ 8//... 9}1011interface IMyInterface12{13//...14}1516class MyGenericClass<T1,T2>17where T1: IEnumerable, IMyInterface18where T2: MyStruct, new()19{20publicvoid MyMethod(T1 t1, T2 t2)21 {22//...23 }24}
yield
yield 在迭代器塊中用於向枚舉數對象提供值或發出迭代結束信號。
// expression 進行計算並以枚舉數對象值的形式返回。expression 必須可以隱式轉換爲迭代器的 yield 類型。yieldreturn expression;yieldbreak;
示例:
1// keywords_yield.cs 2using System; 3using System.Collections; 4 5namespace Hunts.Keywords 6{ 7publicclass Employee 8 { 9privatestring _name;10privateint _id;1112publicstring Name13 {14get { returnthis._name; }15set { this._name = value; }16 }1718publicint ID19 {20get { returnthis._id; }21set { this._id = value; }22 }2324// 爲給定數組中的人名進行編號25publicstatic IEnumerable SetIDs(string[] names)26 {27int counter =0;28 Employee result =new Employee();29while (counter++< names.Length)30 {31 result._id = counter;32 result._name = names[counter -1];33yieldreturn result;34 }35 }36 }3738class EmployeeList39 {40staticvoid Main()41 {42string[] names = { "Jones", "Carl", "Dennis", "Evan", "Hugo", "Ivan" };4344// 顯示編號操作的結果45foreach (Employee e in Employee.SetIDs(names))46 {47 Console.WriteLine("ID:{0} Name:{1}", e.ID,e.Name);48 }4950 Console.Read();51 }52 }53}
注意:
yield 語句只能出現在 iterator 塊中,該塊可用作方法、運算符或訪問器的體。這類方法、運算符或訪問器的體受以下約束的控制:
不允許不安全塊。
方法、運算符或訪問器的參數不能是 ref 或 out。
yield 語句不能出現在匿名方法中。
當和 expression 一起使用時,yield return 語句不能出現在 catch 塊中或含有一個或多個 catch 子句的 try 塊中。