在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
今天谈及这个话题,是因为在看别人代码,遇到的。本着知其然还要知其所以然的精神,在网上大肆查找了一遍。得到了一些答案。并在此做一个简单的笔记,以便自己和他人以后查找,与我一同成长进步。 在C#中this用来指代当前对象,用于当成员函数中的形参名跟成员变量名一致时,进行区分。 但this不仅仅只有这一作用,this还可以如下这样用:
class class1 { private int i_a; private string s_a; public class1() { i_a = 0; s_a = "default"; } public class1(int i_a) { if (i_a > 5 && i_a < 10) { this.i_a = i_a; } s_a = "defalt"; } public class1(string s_a) { this.i_a = 0; this.s_a = s_a; } public class1(int i_a, string s_a) { if (i_a > 5 && i_a < 10) { this.i_a = i_a; } this.s_a = s_a; } public void print() { Console.WriteLine("i_a = {0}", i_a); Console.WriteLine("s_a = {0}", s_a); } } 注意到,这个对成员变量i_a的值的鉴定操作在第2跟第4个构造函数中重复了两次,如果这个操作复杂一点,这样的变量多一点,那重复代码就大大增加,影响了代码的维护性,一旦这个操作规则变化了,改动起来就比较麻烦,所以好的方法当然是将这个鉴定操作提取出来,放到一个单独的函数中,然后统一调用,不过C#还提供了这样一种机制来,稍作修改如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace liuStream { public class Class1 { private int i_a; private string s_a; public Class1() { // i_a = 0; // s_a = "default"; } public Class1(int i_a) : this(3, "default") { } public Class1(string s_a) : this(6, s_a) { } public Class1(int i_a, string s_a) { if (i_a > 5 && i_a < 10) { this.i_a = i_a; } this.s_a = s_a; } public void print() { Console.WriteLine("i_a = {0}", i_a); Console.WriteLine("s_a = {0}", s_a); } } } 调用: Class1 cl = new Class1("我是test"); cl.print(); Class1 c2 = new Class1(8); c2.print(); Console.WriteLine("结束了"); 输出结果:
另外,this还可以用在索引器中。
另外的一种解释说法: 首先,c# 里的 this 代表正在运行的当前实例,也就是这个类的一个实例(只不过系统是自己生成,不用我们显式声明和初始化)
扩展知识
参考: http://www.cnblogs.com/csharp4/archive/2010/02/21/1670008.html http://www.cnblogs.com/promise-7/archive/2012/01/11/2318933.html http://blog.csdn.net/ershouyage/article/details/7637456 |
请发表评论