一、this关键字

在C#中,this关键字有以下3种常见的用法:

  1.用在类的属性、实例方法或实例构造方法中,区分成员名和本地变量(或参数)。下面的示例声明一个名为Myclass的类,类中包括一个实例字段myVal和一个实例构造函数,该构造函数带一个名为myVal的参数,在方法中,通过this可以在语义上区分成员名myVal和参数名myVal。(注意:在实际编程中是不建议参数名和字段名相同的,这样做降低了代码的易读性,这里只是为了说明this关键字的用法而已)。

 1     class MyClass
 2     {
 3 // 声明一个名为"myVal"的整型字段  4 public int myVal = 10;  5  6 // 声明一个构造函数,该函数带一个名为"myVal"的参数  7 public MyClass(int myVal)  8  {  9 // "this"表示MyClass类的当前实例 10 // 在这里通过this可以在语义上区分成员名myVal和参数名myVal 11 this.myVal += myVal; 12  } 13 }

  2.this表示的是当前对象,可以把它作为实参传递到其它方法。例如下面声明一个类MyClass1,它包括一个实例成员方法Compute,而Compute带一个类型为MyClass的参数,该参数在方法中参加运算。

 1     class MyClass1
 2     {
 3 // 声明一个计算的方法,参数类型为MyClass  4 public static int Compute(MyClass mc)  5  {  6 int resutl = 0;  7 if (mc != null)  8  {  9 resutl += mc.myVal; 10  } 11 return resutl; 12  } 13 }

  下面在类MyClass的构造方法中添加了一个本地变量的声明,该变量初始化的值来自MyClass1的Compute方法的计算结果。而这时就可以将this作为实参传递给调用方法了:

 1     class MyClass
 2     {
 3 // 声明一个名为"myVal"的整型字段  4 public int myVal = 10;  5  6 // 声明一个构造函数,该函数带一个名为"myVal"的参数  7 public MyClass(int myVal)  8  {  9 // "this"表示MyClass类的当前实例 10 // 在这里通过this可以在语义上区分成员名myVal和参数名myVal 11 this.myVal += myVal; 12 13 // 使用this作为当前对象的实参传递给Compute方法 14 int res = myVal + MyClass1.Compute(this); 15  } 16 }

  3.声明索引器。接下来在第二部分当中分析索引器的声明和使用方法。

  此外,应当注意的一点:由于静态成员函数存在于类一级,并且不是对象的一部分,没有 this 指针,因此不能在静态方法中使用this关键字。在静态方法中引用 this 是错误的。

二、索引器

  1.通过点运算符访问实例成员

    一般情况下,我们是通过点运算符(“实例名.成员名”)的方式来访问类的实例成员的。比如下面的示例,该例中其实是通过调用属性的set访问器为成员字段赋值,并且通过get访问器读取成员字段的值的。

1     class Course
2     {
3 public float  Chinese { set; get; }
4         public float Math { set; get; }
5         public float Englisth { set; get; }
6     }
7
8     class Program
9     {
10         static void Main(string[] args)
11         {
12 // 声明一个Course类的实例
13             var course = new Course();
14
15             // 使用传统的“实例名.成员名”方式访问成员
16             // 赋值
17             course.Chinese = 95;
18             course.Math = 100;
19 course.Englisth = 80;
20             // 取值
21             Console.WriteLine("语文:{0},数学:{1},英语:{2}", course.Chinese, course.Math, course.Englisth);
22             Console.ReadKey();
23         }
24     }

  2.通过索引器访问实例成员

    通过观察上面示例的代码,可以发现:该类的所有成员具有相同的类型float,它们其实可以像访问数组一样的方式访问,所以,我们可以为类提供另一种实例成员访问方式:索引器。下面的代码为上面的Course类声明加上了一个float类型的索引,并在Main方法中通过索引存取数据:

1     class Course
2     {
3 public float  Chinese { set; get; }
4         public float Math { set; get; }
5         public float Englisth { set; get; }
6
7         // 声明一个公开的float类型的索引器
8         public float this[int index]
9         {
10             // set访问器:赋值
11             set
12             {
13                 switch (index)
14                 {
15                     case 0:
16                         this.Chinese = value;
17                         break;
18                     case 1:
19                         this.Math = value;
20                         break;
21                     case 2:
22                         this.Englisth = value;
23                         break;
24                     default:
25                         // 索引越界时抛出异常
26                         throw new ArgumentOutOfRangeException();
27                 }  
28             }
29             // get访问器:取值
30             get
31             {
32                 switch (index)
33                 {
34                     case 0:
35                         return this.Chinese;
36                     case 1:
37                         return this.Math;
38                     case 2:
39                         return this.Englisth;
40                     default:
41                         throw new ArgumentOutOfRangeException();
42                 }
43             }
44         }
45     }
46
47     class Program
48     {
49         static void Main(string[] args)
50         {
51             // 声明一个Course类的实例
52             var course = new Course();
53
54             // 使用索引器访问实例成员
55             // 赋值
56             course[0] = 95;
57             course[1] = 100;
58             course[2] = 80;
59             // 取值
60             Console.WriteLine("语文:{0},数学:{1},英语:{2}", course[0], course[1], course[2]);
61             Console.ReadKey();
62         }
63     }

  3.什么是索引?

    上面已经声明并且使用了索引,这里分析总结索引的概念和特征:

    1).索引的概念

    索引也是一种类成员,而且必须为实例成员,因为它就是为实例成员提供的一种访问方式,所以不能声明为static的。索引与属性类似,也有get访问器和set访问器。而且索引实际上就是一组get访问器和set访问器,而访问器的本质是方法,所以说,索引器的本质就是方法。索引器经常是在主要用于封装内部集合或数组的类型中声明的。

    2).索引声明

    索引声明使用下面的语法:

    [访问修饰符] 返回值类型 this [ 参数1,参数2...]

    {

      get{......}

      set{......}

    }

    语法要点:索引名称永远为this;索引的参数在方括号中间;索引的参数列表中至少有一个参数。

    3).set访问器

      当索引被用于赋值时,它的set访问器被隐式调用, set访问器的特征如下:

      第一,它的返回值类型为void。

      第二,它的参数列表和索引中声明的参数列表的相同。

      第三,它有一个名为value的隐式值参数,参数类型和索引的类型相同。

    4).get访问器

      当索引被用于取值时,get访问器被隐式调用,get访问器的特征如下:

      第一,它的返回值类型与索引类型相同。

      第二,它的参数列表和索引中声明的参数列表的相同。      

    5).索引的安全性

     在客户端代通过索引访问成员时,很可能发生索引越界等一些异常情况。有两种方式提高索引的安全性:

      第一,为索引声明严格的访问级别控制,比如可以将set访问器的修饰符改为private。

1             // set访问器:赋值
2             private set
3             {
4                 switch (index)
5 { 6                     case 0:
7                         this.Chinese = value;
8                         break;
9                     case 1:
10                         this.Math = value;
11                         break;
12                     case 2:
13                         this.Englisth = value;
14                         break;
15                     default:
16                         // 索引越界时抛出异常
17                         throw new ArgumentOutOfRangeException();
18                 }
19             }

      第二,检查成员的个数,或抛出异常。

1                        // 索引越界时抛出异常
2                         throw new ArgumentOutOfRangeException();

    6).索引重载

      索引可以声明多个参数,也可以重载,索引重载只要参数列表不同就行了。下面为Course类声明几个索引的重载。

1     class Course
2     {
3 public float Chinese { set; get; }
4         public float Math { set; get; }
5         public float Englisth { set; get; }
6
7         // 声明一个公开的float类型的索引器
8         public float this[int index]
9         {
10             // set访问器:赋值
11             set
12             {
13                 switch (index)
14                 {
15                     case 0:
16                         this.Chinese = value;
17                         break;
18                     case 1:
19                         this.Math = value;
20                         break;
21                     case 2:
22                         this.Englisth = value;
23                         break;
24                     default:
25                         // 索引越界时抛出异常
26                         throw new ArgumentOutOfRangeException();
27                 }
28             }
29             // get访问器:取值
30             get
31             {
32                 switch (index)
33                 {
34                     case 0:
35                         return this.Chinese;
36                     case 1:
37                         return this.Math;
38                     case 2:
39                         return this.Englisth;
40                     default:
41                         throw new ArgumentOutOfRangeException();
42                 }
43             }
44         }
45
46         // 索引重载
47         public float this[string name, float val]
48         {
49             set
50             {
51                 switch (name)
52                 {
53                     case "Chinese":
54                         this.Chinese = value + val;
55                         break;
56                     case "Math":
57                         this.Math = value + val;
58                         break;
59                     case "English":
60                         this.Englisth = value + val;
61                         break;
62                     default:
63                         throw new ArgumentOutOfRangeException();
64                 }
65             }
66             get
67             {
68                 switch (name)
69                 {
70                     case "Chinese":
71                         return this.Chinese;
72                     case "Math":
73                         return this.Math;
74                     case "English":
75                         return this.Englisth;
76                     default:
77                         throw new ArgumentOutOfRangeException();

三、索引器和属性的比较

  1.相同点

    1).索引和属性都不用分配内存位置来存储。

    2).索引和属性都是为类的其它成员提供访问控制的。

    3).索引和属性都有get访问器和set访问器,它们可以同时声明两个访问器,也可以只声明其中一个。

  2.不同点

    1).属性通常表示单独的数据成员,而索引表示多个数据成员。

    2).属性既可以声明为实例属性,也可以声明为静态属性,而索引不能声明为静态的。 

    3).属性有简洁的自动实现属性,而索引必须声明完整。

    4).get访问器:属性的 get 访问器没有参数,索引器的 get 访问器具有与索引器相同的形参表。 

    5).set访问器:属性的 set 访问器包含隐式 value 参数。除了值参数外,索引器的 set 访问器还具有与索引器相同的形参表。 

参考:http://msdn.microsoft.com/zh-cn/library/6x16t2tx(VS.100).aspx   

      

C#学习笔记--this关键字和索引器相关推荐

  1. mysql 学习笔记--存储引擎、索引、sq优化

    全面的 mysql学习笔记–通用语法.函数.数据类型.约束.多表查询.事务 全面的 mysql学习笔记–存储引擎.索引.sql优化 全面的mysql学习笔记–视图/存储过程/触发器.锁.InnoDB引 ...

  2. 『SQL Server 2000 Reporting Services学习笔记』(1)报表管理器的使用 与 通过角色分配配置安全性...

    『SQL Server 2000 Reporting Services学习笔记』(1)报表管理器的使用 与 通过角色分配配置安全性 __________________________________ ...

  3. opengl 设置每个点的颜色_OpenGL学习笔记(四)着色器

    本文为学习LearnOpenGL的学习笔记,如有书写和理解错误还请大佬扶正: 教程链接: 着色器 - LearnOpenGL CN​learnopengl-cn.github.io 一,基础概念 1, ...

  4. MongoDB学习笔记(四)--索引 性能优化

    索引                                                                                             基础索引 ...

  5. 《.Net框架程序设计》读书笔记 之 结构和索引器

    一:结构和索引器(又称含参属性) class classStruct {     struct MyStruct     {         public string[] strTest;      ...

  6. .Net学习难点讨论系列16 - 索引器

    索引器是一个我们经常打交道的特性,在编程过程中,多多少少都会用到索引器.而关于索引器一些高级话题,如给自定义的类添加索引器等也是本文着重介绍的.索引器本质上是一组get和set访问器, []中提供的是 ...

  7. Oracle 学习笔记 12 -- 序列、索引、同义词

    数据库的对象包括:表.视图.序列.索引和同义词.在前面的笔记中陆续学习了表和视图,那么本次笔记将学习剩 下的数据库对象,即:序列.索引和同义词. 序列:提供有规律的数值.可供多个用户用来产生唯一数值的 ...

  8. Struts2学习笔记(九) 拦截器(Interceptor)(下)

    拦截器的查找顺序 如果我们在多个地方配置了拦截器,那么框架会按什么样的顺序进行查找呢: (1)   首先查找当前Action是否声明了拦截器,如果有则使用这个拦截器,不再继续寻找,如果没有,则执行下一 ...

  9. MySQL学习笔记(六)索引类别

    1.普通索引 MySQL中最基本的索引类型,没有限制,允许重复,允许NULL CREATE INDEX index_code ON tb_student(code); 2.唯一索引 唯一索引跟普通索引 ...

最新文章

  1. 2021吉林市高考成绩查询系统,吉林省教育考试院高考成绩查询系统入口2021
  2. getname java_关于java:只获取类Class.getName()的名称
  3. Xap packaging failed , Object reference not set to an instance of an object.
  4. Spring Shedule Task之注解实现 (两次启动Schedule Task 的解决方案)
  5. 23种设计模式之命令模式
  6. Oracle左连接、右连接、全外连接以及(+)号用法
  7. 【SpringBoot_ANNOTATIONS】自动装配 01 @Autowired @Qualifier @Primary
  8. (附源码)springboot自律健身房会员管理系统 毕业设计456466
  9. 视频云web播放器样式和组件自定义
  10. 信息安全技术—实验三—PGP邮件加密软件的使用
  11. 【论文笔记】Face Anonymization by Manipulating Decoupled Identity Representation
  12. 如何防止输入同样的编号到数据库中(30分)
  13. RestTemplate使用实战-exchange方法讲解
  14. 这几天加班熬夜把所有Python库整理了一遍,非常全面!
  15. python 安装ltp
  16. AR智能眼镜会成未来趋势
  17. 计算机考证证件照没有露耳朵
  18. 接口文档编写步骤与格式
  19. 【IoT】基于 CC2530 的 ZigBee 物联网系统设计
  20. 【干货】动力电池热管理设计流程和方法(11页ppt)

热门文章

  1. Java 多态-杂谈
  2. mongo 创建用户
  3. 如何查看微信小程序的累计独立访客(UV)
  4. 2022-2028年中国互联网+医药行业市场运行状况及投资潜力研究报告
  5. ubuntu18.04设置代理上网
  6. python3 爬虫实战 :用 Appium 抓取手机 app 微信朋友圈的数据
  7. 第1章 程序设计入门
  8. Bridge Champ:Jelurida实践PlaytoOwn的Web 3社交游戏
  9. java提取图像坐标_java获取图片的GPS信息
  10. 1-8-5 - 定期存款利息计算器