Почему, когда я "сую" один тип данных, в данном случае значимый тип, в тип object, изменения в ней не влияют на переменную типа object

Почему, когда я "сую" один тип данных, в данном случае значимый тип, в тип object, изменения в ней не влияют на переменную типа object

 int x = 10;

 object obj = x;

 x = 5;
 Console.WriteLine(obj); //вывод 10, а не 5

Если возможно, то могли бы объяснить, как можно проще. Заранее благодарен.


Ответы (1 шт):

Автор решения: return

Тут всё оч. просто:

  • Создаёте в стеке (грубо, тут можете узнать доп. инфу) переменную x
  • Упаковываете (boxing (не знаю точно как на русском)), т. е. копируете эту переменную в кучу (obj)
  • Изменяете значение переменной в стеке (т. е. не изменяете значение переменной в куче)

Тут вы выделяете (или используете) память в 2-х местах, следовательно от изменение одного не будет меняться другое.


Если вам нужно изменение by-ref [по ссылке], то используйте… ref!

Пример #1:

static void Main()
{
    var x = 0;

    SomeMethod(ref x); // by-ref

    Console.WriteLine(x); // 5
}
static void SomeMethod(ref int x) // by-ref
{
    x = 5;
}

Пример #2:

public struct SomeStruct // 16 byte size
{
    public double X { get; set; }
    public double Y { get; set; }
}
public sealed class SomeClass
{
    SomeStruct @struct;

    public ref SomeStruct Struct => ref @struct; // by-ref (могут менять поля `@struct`)
}

static void Main()
{
    var @class = new SomeClass();

    @class.Struct.X = 7.0; // если by-val (т. е. без `ref` в `SomeClass.Struct`), то не работает, т.к. значение копируется
    @class.Struct.Y = -3.5; 

    Console.WriteLine(@class.Struct.X); // 7
    Console.WriteLine(@class.Struct.Y); // -3,5
}
→ Ссылка