[英]How is “this” passed in C#
我試圖理解“這個”如何作為C#-6.0(VS 2015)中的屬性傳遞。
using System;
public class Person
{
private Person instance;
public Person()
{
instance = this;
}
public Person myself
{
get { return instance; }
set { instance = value; }
}
public string name = "Eddie";
}
public class Example
{
public static void Main()
{
Person firstPerson = new Person();
Person secondPerson = firstPerson.myself;
secondPerson.name = "Bill";
Console.WriteLine(firstPerson.name);
Console.WriteLine(secondPerson.name);
firstPerson.myself = new Person();
Console.WriteLine(firstPerson.name);
Console.WriteLine(secondPerson.name);
Console.ReadLine();
}
}
我的假設是當線:
Person secondPerson = firstPerson.myself;
運行時,secondPerson成為firstPerson的引用,所以當我將名稱更改為“Bill”時, firstPerson.name
和secondPerson.name
都是Bill。 但是當我跑步的時候
firstPerson.myself = new Person();
我期望firstPerson.name
和secondPerson.name
回到“Eddie”,但它仍然是“Bill”。 為什么? 提前致謝!
您已經更改了firstPerson.instance
指向的Person
實例,但沒有firstPerson
引用的原始實例。
因此, firstPerson
仍指向原始Person
實例(因此firstPerson.name
返回第一個實例中設置的值),而firstPerson.instance
現在指向新的(第二個) Person
實例。
Person firstPerson = new Person(); // instance 1
Person secondPerson = firstPerson.myself; // myself refers to instance 1
secondPerson.name = "Bill"; // set name in instance 1
Console.WriteLine(firstPerson.name); // get name from instance 1
Console.WriteLine(secondPerson.name); // get name from myself in instance 1
Console.WriteLine(firstPerson.myself.name); // get name from instance 1 (same as above)
firstPerson.myself = new Person(); // myself refers to instance 2, but firstPerson still refers to instance 1
Console.WriteLine(firstPerson.name); // still getting name from instance 1
Console.WriteLine(secondPerson.name); // still getting name from myself in instance 1
Console.WriteLine(firstPerson.myself.name); // get name from instance 2 (since firstPerson.myself was reassigned)
firstPerson = new Person(); // firstPerson and firstPerson.myself point to instance 3
Console.WriteLine(firstPerson.name); // get name from instance 3, which is the default "Eddie"
Console.WriteLine(secondPerson.name); // still points to instance 1, since that's what it was when it was assigned
Console.WriteLine(firstPerson.myself.name); // get name from instance 3 (since firstPerson.myself is defaults to the new instance again)
this
表示類的當前實例。
當您創建Person firstPerson.mySelf
新實例時,它將引用Person
類的新實例。
Person firstPerson = new Person();
Person secondPerson = firstPerson.myself; //Here you are referencing to same instance of Person class i.e. same `this`
但是當你創建Person
新實例時,它將引用new this
firstPerson.myself = new Person(); // New instance new `this`, but still `firstPerson` is referencing to previous instance
用圖解釋
在您的情況下,您創建了人的新實例並存儲在
myself
屬性中。 但firstPerson
和secondPerson
仍然指向同this
實例
myself
只是一個變數。 所以當你打電話
Person firstPerson = new Person();
你有兩個指向同一個實例的變量: firstPerson
和firstPerson.myself
。 隨着線
Person secondPerson = firstPerson.myself;
你介紹了仍然指向同一個實例的第三個變量。 現在用
firstPerson.myself = new Person();
你創建第二個實例並使firstPerson.myself
指向這個實例,而變量firstPerson
和secondPerson
仍然指向第一個實例。
1.實際上類變量是引用類型 。
2.因此,當您將同一實例分配給兩個變量時,它們將指向同一個實例。
3.無論何時你要指出什么都要新鮮,你需要使用'new'關鍵字進行分配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.