Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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#_Properties_This - Fatal编程技术网

“是怎么回事?”;这";通过C#

“是怎么回事?”;这";通过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”,但

我试图理解“this”是如何在C#-6.0(VS 2015)中作为属性传递的

我的假设是,当线路:

Person secondPerson=firstPerson.my

运行时,第二个人将成为对第一个人的引用,因此当我将名称更改为“Bill”时,
firstPerson.name
secondPerson.name
都是Bill。但是当我跑的时候

firstPerson.my=newPerson()


我原以为
firstPerson.name
secondPerson.name
会回到“Eddie”,但它仍然是“Bill”。为什么?提前谢谢

表示类的当前实例

当您创建Person
firstPerson.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
实例(并且So
firstPerson.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();