昨天看一本C#的书,写了有关this的用法。今天想起来,就写一个笔记,当做记忆吧。
其实,this说到底有3种用法(我所知道的),下面我很粗略的分析一下,如有不正之处,敬请指教:
1.限定被相似的名称隐藏的成员
这种情况一般式在使用变量的时候,使用2个相同的变量的时候,这个时候this就很有效果了。比如
public class FirstThisDemo { private string name; public FirstThisDemo(string name) { this.name = name; } public void PrintInformation() { Console.WriteLine("输入的名字为{0}", this.name); } }
然后再控制台进行对它的调用:
static void Main(string[] args) { FirstThisDemo firstdemo = new FirstThisDemo("Lanny"); firstdemo.PrintInformation(); }
如你所见,输出的结果是:输入的名字为Lanny。
但是如果你对name的前面不加this的话,比如:
public FirstThisDemo(string name) { name = name; }
那么对不起,当你在控制台调用的时候就显示不出来。而且还会显示出一个警告来:
警告 37 对同一变量进行赋值;是否希望对其他变量赋值?
这个就是this在限定成员中作用。
2.this在索引器的使用
this的第二个用处是可以在类中进行申明索引器,如果这样的话吗,就可以在类中很好对类中的成员进行遍历。
索引器使得对象可按照与数组相似的方法进行索引。
特点如下:
☆get 访问器返回值。set 访问器分配值。
☆this 关键字用于定义索引器。
☆value 关键字用于定义由 set 索引器分配的值。
☆索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。
☆索引器可被重载。
☆索引器可以有多个形参,例如当访问二维数组时
直接看代码,先看一个简单的
class MySecondDemo { private int[] test = new int[10]; public int this[int index] { set { if (index > 0) { test[index] = value; } } get { if (index > 0 && index < 10) { return test[index]; } else { return 0; } } } }
这里的意思是说对数组中的值存入,然后再进行可以想平时array一样,在指定的第几个进行读取。
MySecondDemo thisDemo = new MySecondDemo(); for (int i = 0; i < 10; i++) { thisDemo[i] = i + 1; } Console.WriteLine(thisDemo[8]);
上面输出指定的第8个元素,也就是9.
this的索引器,也可以对class进行索引。比如如下:
class Person { public Person() { } ArrayList lists = new ArrayList(); private string name; private int age; private string province; public string Name { set { name = value; } get { return name; } } public int Age { set { this.age = value; } get { return this.age; } } public string Province { set { this.province = value; } get { return this.province; } } public Person(string name, int age, string province) { this.name = name; this.age = age; this.province = province; } public string this[string name, int age] { set { lists.Add(new Person(name, age, value)); } get { foreach (Person person in lists) { if (person.Age == age && person.name == name) { return person.province; } } return "没有这个省份"; } } /// <summary> /// 重载一个索引器 /// </summary> /// <param name="province">传入省份</param> /// <returns></returns> public ArrayList this[string province] { get { ArrayList temp = new ArrayList(); // if(lists) foreach (Person person in lists) { if (person.province == province) { temp.Add(person); } } return temp; } } }
上面2个例子就是简单的this索引器的实例。
2.1 索引器和属性的区别
下面摘自MSDN的一段比较,MSDN 属性和索引器的区别连接
3.this在用于构造函数声明
因为我们在平时对构造函数重载的时候,如果重载很多的话,会非常的麻烦,所以如果用调用this的话,就可以很好的进行处理。
使用方法:
可以使用如下的形式来声明实例构造函数:
『访问修饰符』【类名】(『形式参数表』) : this(『实际参数表』)
{
【语句块】
}
其中的this表示该类本身所声明的、形式参数表与『实际参数表』最匹配的另一个实例构造函数,这个构造函数会在执行正在声明的构造函数之前执行。
例子我就不写了,博客园内有一篇写的很简练的,原文地址 谢谢EvenPeng的劳动成果。
代码如下:
public class Person { public string personName; //定义年龄为可空类型,这样就可以赋予其null值 public int? personAge; //下面前三个构造函数都是去调用参数最多的第四个构造函数,只取它们所需要的部分参数即可 //这样的做法就是this串联构造函数 public Person():this("",0) { } public Person(string name):this("evan",null) { } public Person(int age):this("",20) { } public Person(string name, int? age) { this.personName = name; //通过 ?? 判断传入的age是否null值 //如果属于null值,则赋值100 this.personAge = age ?? 100; } public void Display() { Console.WriteLine("Name:{0},Age:{1}\n", personName, personAge); } }
然后再控制台调用相关:
static void Main(string[] args) { Person per1 = new Person(); per1.Display(); Person per2 = new Person(20); per2.Display(); Person per3 = new Person("evan"); per3.Display(); Person per4 = new Person("evan", 20); per4.Display(); Console.ReadLine(); }
这样的做法就是让一个接受参数最多的构造函数做"主构造函数", 且在主构造函数中实现必须的业务逻辑,其余的构造函数只要使用this关键字把传入的参数转发给主构造函数,并且提供必须的其它参数,这样子,我们整个类中需要我们操心的就是那个主构造函数了,其余构造函数基本上可以为空(注意:如果构造函数链中还有实现各自的逻辑,那么实际上是先执行主构造函数的代码,再执行各自逻辑),使用这种做法,真正的工作都交给了一个构造函数,类定义就会更简洁、更易维护、简化了编程任务。
参考文献:Even Peng 博客:http://www.cnblogs.com/py891021/archive/2009/09/15/1566859.html
MSDN.