原始代码和说明如下:
此引用引用实例本身。在以下示例中, 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);
}
}
我根据以下代码绘制了一个图表:
基于我的理解,PA1的Mate现在指向堆中的PA2对象,而PA2的Mate现在指向堆中的PA1对象。
我是否正确理解了这种情况下的关键字?谢谢你的帮助。
答案 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
。