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



一、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();

78                 }

79             }

80         }

81

82         // 重载2:只读索引

83         protected
string this[int index,
string name, bool flag]

84         {

85            
set

86             {

87

88             }

89         }

90

91     }

三、索引器和属性的比较

  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   

      

时间: 2024-08-28 06:26:36

C#学习笔记--this关键字和索引器的相关文章

Mysql学习笔记(八)索引

原文:Mysql学习笔记(八)索引 PS:把昨天的学习内容补上...发一下昨天学的东西....五月三日...继续学习数据库... 学习内容: 索引.... 索引的优点: 1.通过创建唯一索引,可以保证数据库每行数据的唯一性... 2.使查找的速度明显加快... 3.当使用分组和排序进行查询时,可以缩短时间... 索引的缺点: 1.维护索引需要耗费数据库的资源... 2.索引需要占用磁盘空间... 3.对表进行增删改的时候,由于索引的存在,时间会有所增加... 索引的分类... 普通索引和唯一索引

javasE学习笔记:关键字super的使用

/* super 的作用: 1 . super可以在子类中引用父类的成员,通过 .的方式和属性.this相对应. 2. 在子类的构造方法中可以可使用super(参数列表)语句调用父类的构造方法 3. 注意: 子类的构造方法中一定要调用父类的构造方法.... */ javasE学习笔记:关键字super的使用,布布扣,bubuko.com

Linux学习笔记——例说makefile 索引博文

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 博文试图从简到难,通过例子说明makefile的写法,而不是整段或整片的抄袭网络上的文章. 1.索引 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一

Python学习笔记__4.4章 装饰器(添加额外功能)

# 这是学习廖雪峰老师python教程的学习笔记 1.概览 装饰器可以帮助我们为已经存在的对象添加额外的功能 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 装饰器经常用于有切面需求的场景,比如:插入日志.性能测试.事物处理.缓存.权限校验等场景. 1.1.为now函数 加一行日志 # 定义now函数 def now(): print('2018-5-8') # 编辑decorator def log(func):

this关键字和索引器

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

MongoDB 学习笔记之 $or与索引关系

$or与索引关系: 对leftT集合的timestamp创建索引 执行$or语句:db.leftT.find({$or: [{ "timestamp" : 5},{"age": 10}]}).explain(true),发现没有使用任何索引 对age再创建索引 重新再次查看查询计划: 索引被使用了. 结论: 如果使用了$or操作符,必须保证关键字都有索引,如果其中任何一个关键字没有索引,则默认没有索引,会使用全表扫描.

Jsoup学习笔记10:Saz2Csv解析器

经过了一系列的学习和摸索,Jsoup学习笔记即将告一段落,第11篇学习笔记将会把本篇实现的功能界面化,并做成一个可直接执行的exe文件.后续的项目如果需要更深入的学习Jsoup,还会继续更新. 本篇笔记主要是对前面的9篇笔记进行整合,初步实现saz格式文件到csv文件转换的基本功能,程序要实现的基本功能主要是: 1.saz文件遍历:获取Java工程所在目录的上层目录中,指定扩展名(.saz)的文件, 2.遍历获得的上层目录,复制包含指定文件(.saz)的所有文件夹,并在创建的同名文件夹中创建同名

Python学习笔记(十一)装饰器

摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000#0 本文章完全用来个人复习学习,侵删: 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25') ... >

Elasticsearch学习笔记-03.3创建索引

来吧,咱们一起创建一个名为"customer"的索引,然后查看集群中的所有索引: PUT /customer?pretty GET /_cat/indices?v 第一个命令使用PUT创建了一个名为customer的索引.我们简单的在命令后追加了一个pretty参数,用于将JSON类型的返回值格式化后打印在控制台. 我们也可以使用POST MAN操作,我们会得到类似下图所示的返回结果: 第二个命令的结果告诉我们(为方便查看,我直接在浏览器中打开了链接:http://localhost: