Как «это» передается в C # - PullRequest
9 голосов
/ 21 мая 2019

Я пытаюсь понять, как «это» передается как свойство в 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, поэтому, когда я изменяю имя на «Билл», firstPerson.name и secondPerson.name оба обозначают Билла. Но когда я бегу

firstPerson.myself = new Person();

Я ожидал, что firstPerson.name и secondPerson.name вернутся к "Эдди", но это останется "Биллом". Зачем? Заранее спасибо!

Ответы [ 4 ]

7 голосов
/ 21 мая 2019

Вы изменили экземпляр Person, на который указывает firstPerson.instance, но не исходный экземпляр, на который ссылается firstPerson.

Таким образом, firstPerson по-прежнему указывает на исходный Person instance (и, таким образом, 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)
6 голосов
/ 21 мая 2019

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, он будет ссылаться на новый this

firstPerson.myself = new Person();  // New instance new `this`, but still `firstPerson` is referencing to previous instance

Пояснение к диаграмме

enter image description here

В вашем случае вы создали новый экземпляр лица и сохранили в myself имущество. но firstPerson и secondPerson все еще указывают на тот же this экземпляр

3 голосов
/ 21 мая 2019

myself - это просто переменная.Поэтому, когда вы вызываете

Person firstPerson = new Person();

, у вас есть 2 переменные, которые указывают на один и тот же экземпляр: firstPerson и firstPerson.myself.В строке

Person secondPerson = firstPerson.myself;

вы вводите третью переменную, которая все еще указывает на тот же экземпляр.Теперь с

firstPerson.myself = new Person();

вы создаете второй экземпляр и firstPerson.myself указывает на этот экземпляр, а переменные firstPerson и secondPerson по-прежнему указывают на первый.

0 голосов
/ 27 мая 2019

1. На самом деле переменные класса являются ссылочными типами .

2. Поэтому, когда вы назначаете один и тот же экземпляр двум переменным, они будут указывать на один и тот же экземпляр.

3.Куда бы вы ни указали, свежую, вам нужно использовать «новое» ключевое слово для назначения.

...