C# 参考之上下文关键字get、set、value、partial、where和yield

上下文关键字用于提供代码中的特定含义,但它不是 C# 中的保留字。

get、set、value

get 在属性或索引器中定义“访问器”方法,以检索该属性或该索引器元素的值。

set 义属性或索引器中的“访问器”方法,用于设置属性或索引器元素的值。

value 隐式参数,用于设置访问器以及添加或移除事件处理程序。

// 简单示例

class Employee

{

private string _name;

public string Name

{

get { return this._name; }

set { this._name = value; }

}

}

注意

  1. get、set“访问器”,在默认情况下具有相同的访问级别。但是有时鉴于对读写的考虑,通常可以限制set的访问级别。对属性或索引器使用访问修饰符受以下条件的制约:
    1. 不能对接口或显式接口成员实现使用访问器修饰符。

    2. 仅当属性或索引器同时具有 set 和 get 访问器时,才能使用访问器修饰符。这种情况下,只允许对其中一个访问器使用修饰符。

    3. 如果属性或索引器具有 override 修饰符,则访问器修饰符必须与重写的访问器的访问器(如果有的话)匹配。

    4. 访问器的可访问性级别必须比属性或索引器本身的可访问性级别具有更严格的限制。


partial

partial 分部类型定义允许将类、结构或接口的定义拆分到多个文件中。

[modifiers] partial type

  1. modifiers是可选的。可以是abstract、new、override、static、virtual、extern,以及访问修饰符中的一个。
  2. type 可以是类、结构和接口之一。

示例

以下的部分类在编译时,将会合并,包括它的方法、类型特性等等。

 1 namespace Hunts.Keywords
 2 {
 3     [System.Serializable]
 4     partial class Test
 5     {
 6         void Test1() { }
 7     }
 8     [Conditional("DEBUG")]
 9     partial class Test
10     {
11         void Test2() { }
12     }
13 }

类相当于:

 1 namespace Hunts.Keywords
 2 {
 3     [System.Serializable]
 4     [Conditional("DEBUG")]
 5     class Test
 6     {
 7         void Test1() { }
 8         void Test2() { }
 9     }
10 }

关于部分(类、接口、结构)的详细使用,可以参阅MSDN Library中的部分类。


where

where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量。

  1. 之所以使用类型约束是因为如果要检查泛型列表中的某个项以确定它是否有效,或者将它与其他某个项进行比较,则编译器必须在一定程度上保证它需要调用的运算符或方法将受到客户端代码可能指定的任何类型参数的支持。这种保证是通过对泛型类定义应用一个或多个约束获得的。
// 句法
public class MyGenericClass<T> where T:something
    1. something可以是:结构、类、new()、<基类名>或<接口名称>。
    2. 可以同时具有1中的多个约束,且约束自身也可以是泛型类型。
    3. 也可以将约束作用于泛型方法或委托。

要更深入的了解可以参阅MSDN Library中的“泛型编程”以及“类型参数的约束”这些内容。

示例

 1 // keywords_where.cs
 2 
 3 using System;
 4 using System.Collections;
 5 
 6 struct MyStruct
 7 {
 8     //...
 9 }
10 
11 interface IMyInterface
12 {
13     //...
14 }
15 
16 class MyGenericClass<T1,T2>
17     where T1: IEnumerable, IMyInterface
18     where T2: MyStruct, new()
19 {
20     public void MyMethod(T1 t1, T2 t2)
21     {
22         //...
23     }
24 }

yield

yield 在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。

// expression 进行计算并以枚举数对象值的形式返回。expression 必须可以隐式转换为迭代器的 yield 类型。
yield return expression;
yield break;

示例

 1 // keywords_yield.cs
 2 using System;
 3 using System.Collections;
 4 
 5 namespace Hunts.Keywords
 6 {
 7     public class Employee
 8     {
 9         private string _name;
10         private int _id;
11 
12         public string Name
13         {
14             get { return this._name; }
15             set { this._name = value; }
16         }
17 
18         public int ID
19         {
20             get { return this._id; }
21             set { this._id = value; }
22         }
23 
24         // 为给定数组中的人名进行编号
25         public static IEnumerable SetIDs(string[] names)
26         {
27             int counter = 0;
28             Employee result = new Employee();
29             while (counter++ < names.Length)
30             {
31                 result._id = counter;
32                 result._name = names[counter - 1];
33                 yield return result;
34             }
35         }
36     }
37 
38     class EmployeeList
39     {
40         static void Main()
41         {
42             string[] names = { "Jones", "Carl", "Dennis", "Evan", "Hugo", "Ivan" };
43 
44             // 显示编号操作的结果
45             foreach (Employee e in Employee.SetIDs(names))
46             {
47                 Console.WriteLine("ID:{0} Name:{1}", e.ID,e.Name);
48             }
49 
50             Console.Read();
51         }
52     }
53 }

注意

  1. yield 语句只能出现在 iterator 块中,该块可用作方法、运算符或访问器的体。这类方法、运算符或访问器的体受以下约束的控制:
    • 不允许不安全块。
    • 方法、运算符或访问器的参数不能是 ref 或 out。
  2. yield 语句不能出现在匿名方法中。
  3. 当和 expression 一起使用时,yield return 语句不能出现在 catch 块中或含有一个或多个 catch 子句的 try 块中。