1. 代表当前类的对象
当我们想实现通过调用方法去修改name的值,以下代码中的方法是有问题的。
首先在以下代码中,我们会发现有2个“name”,那么代码中“name = name”都是指哪个name?
当字段和变量名同名的时候,就近原则,所以说“name = name”都是指的是方法的参数name,而不是字段name。
private string name;
public void SetName(string name)
{
name = name;
}
若想实现我们的目标,只需添加一个关键字“this”,this调用的是成员变量,该例子即字段name.
private string name;
public void SetName(string name)
{
this.name = name;
}
2. 串联构造函数
查看以下代码会发现,有很多部分是重复的,代码是冗余的,那么如何解决这个问题呢?
class Student
{
string Name;
int Age;
char Gender;
int Chinese;
int Math;
int English;
public Student(string name,int age,char gender,int chinese,int math,int english)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
this.Chinese = chinese;
this.Math = math;
this.English = english;
}
public Student(string name,int chinese, int math, int english)
{
this.Name = name;
this.Chinese = chinese;
this.Math = math;
this.English = english;
}
public Student(string name, int age, char gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
}
在一个类中如果需要实现多个自定义构造函数,通常做法是在构造函数中实现各自的业务逻辑,如果这些业务逻辑的实现并非截然不同的话,极不利于维护,当然,我们也可以通过将相同的逻辑部分封装成一个方法,但还有一种更为合理简单的方法,下面就通过this关键字来实现串联构造函数做的先前代码的简化。
class Student
{
string Name;
int Age;
char Gender;
int Chinese;
int Math;
int English;
public Student(string name,int age,char gender,int chinese,int math,int english)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
this.Chinese = chinese;
this.Math = math;
this.English = english;
}
//对于不属于该构造函数的参数age和gender随意写入只要格式没有问题即可
public Student(string name,int chinese, int math, int english):this(name,0,'0',chinese,math,english)
{
}
//同上,对于不属于该构造函数的参数chinese、math和english随意写入只要格式没有问题即可
public Student(string name, int age, char gender) : this(name, age, gender, 0, 0, 0)
{
}
当执行如下主程序的时候,程序调用顺序如下:
- 调用类中的构造函数 public Student(string name,int chinese, int math, int english);
- 因为有了“ :this ”的存在,接下来调用 public Student(string name,int age,char gender,int chinese,int math,int english);
- 最后执行public Student(string name,int chinese, int math, int english);{ 最后执行的内容 }中,中括号里面的内容
class Program
{
static void Main(string[] args)
{
Student per1 = new Student("小李", 78, 88, 90);
}
}