Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C这个关键词-我的理解_C#_This - Fatal编程技术网

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

C# C这个关键词-我的理解,c#,this,C#,This,原代码及说明如下: 此引用引用引用实例本身。在下面的示例中 Mary方法使用此选项设置合作伙伴的配偶字段: public class Panda { public Panda Mate; public void Marry(Panda partner) { Mate = partner; partner.Mate = this; } } 我创建了以下代码: public class Panda { public Panda

原代码及说明如下:

此引用引用引用实例本身。在下面的示例中 Mary方法使用此选项设置合作伙伴的配偶字段:

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的对象


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

是的,你的理解很清楚。它保存当前类对象的实例

查看此代码,您已经更改了名称,因此更易于阅读:

Panda george = new Panda();
Panda elaine = new Panda();
george.Marry(elaine);
当您调用Marry方法时,您正在传递elaine作为参数。但这里有一个不明显的部分:另一个论点在伊莱恩面前通过,这个论点是乔治。是的,george是隐式传递的,因为Marry是一个实例方法,而您正在调用它的实例是george。这个隐式传递的参数被推送到mary方法的堆栈上,它被命名为This。因此,在方法mary中,如下所示:

public void Marry(Panda partner)
{
    Mate = partner;
    partner.Mate = this;
}
您传递的显式参数是partner,因此它将是elaine,但隐式传递的参数是george。因此,这在Marry方法中意味着和指的是george。因此,这一行代码:

partner.Mate = this;
意思是伊莱恩。马特=乔治

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


离题但密切相关:这是更多或更少的,如何像实例方法一样处理。扩展方法的第一个参数总是这个。

是的,你说得对。你可以结束这个问题,这个问题对你的理解并不重要,但是你的图表暗示了一个常见的误解。Mary方法的代码在该类的两个、三个或n个实例之间不重复,但两个实例都有一个名为method table的隐藏字段,该字段指向Mary方法代码所在的内存区域,并由Panda类的任何实例使用。您好@Steve,非常感谢您指出这一点。我是C语言的新手,所以我对代码本身有很多误解。如果可能的话,我可以请您为我画一个简单的图表来说明您的答案以帮助我理解吗?您的图表看起来不错,但只是以不同的方式概述了Panda类的方法,例如用---而不是实线来突出方法代码的共同性质。这只是一个惯例,如果你搜索你的图表工具,你会发现一些具体的方式来说明这个问题concept@Steve非常感谢您指出这一点,我记下了您所说的内容,这对您的学习非常有帮助me@user8778584我很高兴能帮上忙。请阅读。