解析C#关键字之get、set、value、partial、where和yield

开发 后端
本文详细介绍了C#关键字get、set、value、partial、where和yield的用法,供大家参考。

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

C#关键字——get、set、value

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

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

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

  1. // 简单示例  
  2. class Employee  
  3. {  
  4. private string _name;  
  5. public string Name  
  6.     {  
  7. get { return this._name;  }  
  8. set { this._name = value; }  
  9.     }  

注意:

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

不能对接口或显式接口成员实现使用访问器修饰符。

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

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

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

C#关键字——partial

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

[modifiers] partial type

modifiers是可选的。可以是abstract、new、override、static、virtual、extern,以及访问修饰符中的一个。

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.     }  

类相当于:

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

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

C#关键字——where

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

之所以使用类型约束是因为如果要检查泛型列表中的某个项以确定它是否有效,或者将它与其他某个项进行比较,则编译器必须在一定程度上保证它需要调用的运算符或方法将受到客户端代码可能指定的任何类型参数的支持。这种保证是通过对泛型类定义应用一个或多个约束获得的。

  1. // 句法  
  2. public class MyGenericClass< T> where T:something 

something可以是:结构、类、new()、< 基类名>或< 接口名称>。

可以同时具有1中的多个约束,且约束自身也可以是泛型类型。

也可以将约束作用于泛型方法或委托。

要更深入的了解可以参阅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.     }  

C#关键字——yield

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

  1. // expression 进行计算并以枚举数对象值的形式返回。expression 必须可以隐式转换为迭代器的 yield 类型。  
  2. yield return expression;  
  3. 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.    }  

注意:

yield 语句只能出现在 iterator 块中,该块可用作方法、运算符或访问器的体。这类方法、运算符或访问器的体受以下约束的控制:

不允许不安全块。

方法、运算符或访问器的参数不能是 ref 或 out。

yield 语句不能出现在匿名方法中。

当和 expression 一起使用时,yield return 语句不能出现在 catch 块中或含有一个或多个 catch 子句的 try 块中。

【编辑推荐】

  1. 总结C#语言命名规范
  2. C#反射相关知识学习
  3. 大话F#和C#:是否会重蹈C#失败的覆辙?
  4. 总结和学习C#接口
  5. 学习C#程序有感
责任编辑:book05 来源: cnblogs
相关推荐

2009-12-18 11:37:54

Ruby关键字yiel

2009-07-31 16:34:17

dynamicC# 4.0

2009-09-02 09:24:03

C# this关键字

2009-08-21 14:58:56

C# this关键字

2013-01-30 10:12:14

Pythonyield

2009-08-13 13:04:29

C# lock关键字

2009-08-26 15:16:29

C# lock关键字

2009-08-06 17:52:23

C#增加that关键字

2009-08-13 17:44:34

C# using关键字

2009-08-21 14:47:59

C# base关键字

2009-08-21 14:16:35

C# New关键字

2009-09-10 16:38:43

C# get set用

2009-09-01 15:25:04

C# default关

2023-12-11 13:59:00

YieldPython生成器函数

2024-03-15 11:52:03

C++关键字编程

2009-09-11 09:15:32

C# get set

2024-06-04 17:02:38

newC#编程语言

2009-12-17 13:57:15

Ruby关键字

2009-08-13 09:49:16

C#关键字

2011-06-14 13:26:27

volatile
点赞
收藏

51CTO技术栈公众号