Странное поведение объекта C #

Я заметил кое-что в C # при работе с настраиваемыми объектами, что мне показалось немного странным. Я уверен, что это просто непонимание с моей стороны, так что, возможно, кто-то сможет меня просветить.

Если я создаю настраиваемый объект, а затем назначаю этот объект свойству другого объекта, а второй объект модифицирует назначенный ему объект, эти изменения отражаются в том же классе, который выполнил назначение, даже если ничего не возвращается.

Вы хотите это на английском? Вот пример:

class MyProgram
{
    static void Main()
    {
        var myList = new List<string>();
        myList.Add("I was added from MyProgram.Main().");
        var myObject = new SomeObject();
        myObject.MyList = myList;
        myObject.DoSomething();

        foreach (string s in myList)
            Console.WriteLine(s); // This displays both strings.
    }
}

public class SomeObject
{
    public List<string> MyList { get; set; }

    public void DoSomething()
    {
        this.MyList.Add("I was added from SomeObject.DoSomething()");
    }
}

В приведенном выше примере я мог подумать, что, поскольку SomeObject.DoSomething () возвращает void, эта программа будет отображать только «Я был добавлен из MyProgram.Main ( ). ».Однако список List на самом деле содержит как эту строку, так и «Я был добавлен из SomeObject.DoSomething ()» .

Вот еще один пример. В этом примере строка остается неизменной. В чем разница и что мне не хватает?

class MyProgram
{
    static void Main()
    {
        var myString = "I was set in MyProgram.Main()";
        var myObject = new SomeObject();
        myObject.MyString = myString;
        myObject.DoSomething();

        Console.WriteLine(myString); // Displays original string.
    }
}

public class SomeObject
{
    public string MyString { get; set; }

    public void DoSomething()
    {
        this.MyString = "I was set in SomeObject.DoSomething().";
    }
}

В этом примере программы отображается «Я был установлен в MyProgram.Main ()» . Увидев результаты первого образца, я мог предположить, что вторая программа перезаписала бы строку с помощью «Я был установлен в SomeObject.DoSomething ().» . Думаю, я что-то недопонимаю.

5
задан halfer 9 December 2018 в 22:04
поделиться