细说”:this”

最近发现this 有一个很有意思的地方  当我们需要多个构造函数的时候可以大大减少代码量~~先看个简单Demo

class Person
{
    public string Name{get;set;}
    public int Age{get;set;}
    public Person(string names, int iage)
    {
        this.Name = names;
        this.Age = iage;
    }
    public Person() : this("Trigged", 21) { }
    public Person(string names) : this(names , iage: default(int)) { }
    public Person(int iage) : this("", iage) { }
    public override string ToString()
    {
        return string.Format("Name is {0},  Age is :{1}",Name,Age);
    }
}

//调用如下

Person p1 = new Person();
Console.WriteLine(p1);
Person p2 = new Person(20);
Console.WriteLine(p2);
Person p3 = new Person("Trigged");
Console.WriteLine(p3);
Person p4 = new Person("Trigged", 21);
Console.WriteLine(p4);
Console.ReadKey();

很简单的代码 但是加红的地方使用的是 : this ,注意 少了”: ”意义就变 。简单讲 这个可以使  多个构造函数共享同一个 实现。

代码中我们共定义了4个构造,但是 只有第一个构造实现了赋值,其他三个都没有具体的赋值。这个是调用结果

image

~如果你已经猜到了 就可以结束本篇了,如果你觉得很有意思 ,接下来我们一起分析~

用Reflector  打开后先不要急着看IL , 可以先把版本设置为None

public Person()

{

this..ctor("Trigged", 21);

return;

}

public Person(int iage)

{

this..ctor("", iage);

return;

}

public Person(string names)

{

int num;

num = 0;

this..ctor(names, num);

return;

}

public Person(string names, int iage)

{

base..ctor();

this.Name = names;

this.Age = iage; return;

}

从这就可以发现 前面3个构造其 本质调用的还是最后一个构造函数 通过 :this 关联起来,如果不信 可以在 第四个构造函数上加上一段输出语句 

public Person(string names, int iage)
{
    Console.WriteLine("I'was  constructed");
    this.Name = names;
    this.Age = iage;
}

其他代码不变可以发现 在实例化的时候都会输出这条语句

Enjoy ~

原文地址:https://www.cnblogs.com/trigged/p/2141303.html