“是怎么回事?”;这";通过C#
我试图理解“this”是如何在C#-6.0(VS 2015)中作为属性传递的 我的假设是,当线路:“是怎么回事?”;这";通过C#,c#,properties,this,C#,Properties,This,我试图理解“this”是如何在C#-6.0(VS 2015)中作为属性传递的 我的假设是,当线路: Person secondPerson=firstPerson.my 运行时,第二个人将成为对第一个人的引用,因此当我将名称更改为“Bill”时,firstPerson.name和secondPerson.name都是Bill。但是当我跑的时候 firstPerson.my=newPerson() 我原以为firstPerson.name和secondPerson.name会回到“Eddie”,但
Person secondPerson=firstPerson.my代码>
运行时,第二个人将成为对第一个人的引用,因此当我将名称更改为“Bill”时,firstPerson.name
和secondPerson.name
都是Bill。但是当我跑的时候
firstPerson.my=newPerson()代码>
我原以为firstPerson.name
和secondPerson.name
会回到“Eddie”,但它仍然是“Bill”。为什么?提前谢谢 此
表示类的当前实例
当您创建PersonfirstPerson.my
的新实例时,此时它将引用Person
类的新实例
Person firstPerson = new Person();
Person secondPerson = firstPerson.myself; //Here you are referencing to same instance of Person class i.e. same `this`
但是,当您创建Person
的新实例时,它将引用新的此
firstPerson.myself = new Person(); // New instance new `this`, but still `firstPerson` is referencing to previous instance
图解说明
在您的案例中,您创建了person的新实例,并存储在imf
财产。但是firstPerson
和secondPerson
仍然指向
相同的此
实例
您已更改了firstPerson.instance
指向的Person
实例,但未更改firstPerson
引用的原始实例
所以firstPerson
仍然指向原始的Person
实例(并且SofirstPerson.name
返回在第一个实例中设置的值),而firstPerson.instance
现在指向一个新的(第二个)Person
实例
Person firstPerson=new Person();//实例1
Person secondPerson=firstPerson.my;//我自己指的是实例1
secondPerson.name=“比尔”//在实例1中设置名称
Console.WriteLine(firstPerson.name);//从实例1获取名称
Console.WriteLine(secondPerson.name);//在实例1中获取我自己的名字
Console.WriteLine(firstPerson.imf.name);//从实例1获取名称(同上)
firstPerson.imf=新的Person();//我自己提到实例2,但第一人称仍然提到实例1
Console.WriteLine(firstPerson.name);//仍在从实例1获取名称
Console.WriteLine(secondPerson.name);//在实例1中仍然从我自己那里得到名称
Console.WriteLine(firstPerson.imf.name);//从实例2获取名称(自重新分配firstPerson.Own以来)
第一个人=新的人();//第一人称和第一人称。我指的是实例3
Console.WriteLine(firstPerson.name);//从实例3获取名称,这是默认的“Eddie”
Console.WriteLine(secondPerson.name);//仍然指向实例1,因为它在分配时就是这样
Console.WriteLine(firstPerson.imf.name);//从实例3获取名称(因为firstPerson.myelf再次默认为新实例)
我自己
只是一个变量。所以当你打电话的时候
Person firstPerson = new Person();
您有两个变量指向同一个实例:firstPerson
和firstPerson.my
。用线
Person secondPerson = firstPerson.myself;
引入第三个变量,它仍然指向同一个实例。现在
firstPerson.myself = new Person();
创建第二个实例并使第一人称。我自己
指向这个实例,而变量第一人称
和第二人称
仍然指向第一个。1。实际上类变量是引用类型
2.所以当你把同一个实例赋给两个变量时,它们会指向同一个实例
3.无论何时指向新值,都需要使用'new'关键字进行赋值。新值将存储在Person
类的新实例中@MongZhu,如果这不能回答你的问题,那么你能详细说明你想说什么吗?这一天可能太长了;)显然,我无法全面地表达自己:)如果OP得到了你的解释,那么这就足够了。祝你晚上愉快:)@MongZhu,我想这就是你想说的。。请看我的最新图片和我的最后一段answer@PrasadTelkikar,很遗憾,我无法查看图像(已阻止),但感谢您的回复这仍然让我感到困惑,格兰特的解释对我来说更有意义。@格兰特的解释比我更清楚我同意,但我试图向你解释这一点以及它在你的程序中是如何工作的。。但我完全同意接受的答案是解释你们程序行为的最简单的方法,+1给你们,格兰特谢谢。为了澄清,当您执行“Person secondPerson=firstPerson.imf”时,您是在创建对实例1的“引用”吗?(C++中的一个引用;即第一人称和第二人称指的是同一个对象)谢谢回复!Grant的逐行评论让我更清楚了,但我认为你们两个说的是同一件事。不是这样的答案,而是为了获得所需的行为,需要引入一个属性:公共字符串名称{get{return imf.Name;}set{imf.Name=value;}。然后最好将小写的“name”设为私有。
firstPerson.myself = new Person();