Почему, когда я "сую" один тип данных, в данном случае значимый тип, в тип 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
}