簡體   English   中英

如何在C#中傳遞“this”

[英]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.namesecondPerson.name都是Bill。 但是當我跑步的時候

firstPerson.myself = new Person();

我期望firstPerson.namesecondPerson.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屬性中。 firstPersonsecondPerson仍然指向同this實例

myself只是一個變數。 所以當你打電話

Person firstPerson = new Person();

你有兩個指向同一個實例的變量: firstPersonfirstPerson.myself 隨着線

Person secondPerson = firstPerson.myself;

你介紹了仍然指向同一個實例的第三個變量。 現在用

firstPerson.myself = new Person();

你創建第二個實例並使firstPerson.myself指向這個實例,而變量firstPersonsecondPerson仍然指向第一個實例。

1.實際上類變量引用類型

2.因此,當您將同一實例分配給兩個變量時,它們將指向同一個實例。

3.無論何時你要指出什么都要新鮮,你需要使用'new'關鍵字進行分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM