C#这个关键字 - 我的理解

时间:2017-11-04 16:29:47

标签: c# this

原始代码和说明如下:

此引用引用实例本身。在以下示例中, Marry方法使用它来设置伙伴的配偶字段:

public class Panda
{
    public Panda Mate;
    public void Marry(Panda partner)
    {
        Mate = partner;
        partner.Mate = this;
    }
}

我创建了以下代码:

public class Panda
{
    public Panda Mate;
    public void Marry(Panda partner)
    {
        Mate = partner;
        partner.Mate = this;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Panda PA1 = new Panda();
        Panda PA2 = new Panda();
        PA1.Marry(PA2);
    }
}

我根据以下代码绘制了一个图表:

Diagram

基于我的理解,PA1的Mate现在指向堆中的PA2对象,而PA2的Mate现在指向堆中的PA1对象。

我是否正确理解了这种情况下的关键字?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

是的,你的理解是明确的。 包含当前类对象的实例。

答案 1 :(得分:0)

请参阅此代码(我更改了命名,以便更容易阅读):

Panda george = new Panda();
Panda elaine = new Panda();
george.Marry(elaine);

当您调用Marry方法时,您将传递elaine作为参数。但是这里的部​​分并不明显:另一个参数在elaine之前传递,而且该参数是george。是george隐式传递 ,因为Marry是一个实例方法,而您调用它的实例是george。这个隐式传递的参数被推送到Marry方法的堆栈上,它被命名为this。因此,在方法Marry内部看起来像这样:

public void Marry(Panda partner)
{
    Mate = partner;
    partner.Mate = this;
}

您传递的显式参数为partner,因此它将为elaine,但隐式传递的参数为george。因此,this方法中的Marry将表示并引用george。因此这行代码:

partner.Mate = this;

表示 elaine.Mate = george

总之,隐式参数总是传递给实例方法,参数是调用实例方法的对象。该参数成为this参数。

偏离主题但密切相关:这更像是Extension Methods如何被视为实例方法。扩展方法的第一个参数始终为this