Информация об изменениях

Сообщение Re[5]: Передать this в виде object от 15.03.2024 11:22

Изменено 15.03.2024 13:37 Serginio1

Re[5]: Передать this в виде object
Здравствуйте, drVanо, Вы писали:

V>>>Дак это вы просто копируете содержимое копии обратно в this

S>>Так в этом и заключается боксинг унбоксинг.
S>>Приведя структуру к объекту ты создаешь новый объект. Изменяешь его и должен обратно его присвоить структуре.

V>А хотелось бы без копирования.


V>Я тут задавал вопрос чуть выше:

V>
V>            public unsafe void Move(int a, int b)
V>            {
V>                fixed (Point* p = &this)
V>                {
V>                    MoveObject(Pointer.Box(p, typeof(Point*)), a, b);
V>                }
V>                Console.WriteLine("point from this: {0}.{1}", x, y);
V>            }
V>


V>Я правильно понимаю, что GC не может перемещать ValueType в куче пока выполняется любой из его методов (в данном случае если убрать fixed)?


ValueType может быть как на стеке, так и полем объекта. Он сам по себе в куче не может быть. Только его отбоксенговая копия.

Я же тебе привел пример правильного использования

 public void Move(int a, int b)
 {
     MoveObject(ref this, a, b);
     Console.WriteLine("point from this: {0}.{1}", x, y);
 }

 static void MoveObject(ref Point p, int a, int b)
 {
  
     p.x += a;
     p.y += b;
     Console.WriteLine("point from object: {0}.{1}", p.x, p.y);
 }



Для не статика


public void MoveObject(int a, int b)
 {
  
     this.x += a;
     this.y += b;
     Console.WriteLine("point from object: {0}.{1}", this.x, this.y);
 }


Почитай еще https://habr.com/ru/companies/microsoft/articles/423061/
Re[5]: Передать this в виде object
Здравствуйте, drVanо, Вы писали:

V>>>Дак это вы просто копируете содержимое копии обратно в this

S>>Так в этом и заключается боксинг унбоксинг.
S>>Приведя структуру к объекту ты создаешь новый объект. Изменяешь его и должен обратно его присвоить структуре.

V>А хотелось бы без копирования.


V>Я тут задавал вопрос чуть выше:

V>
V>            public unsafe void Move(int a, int b)
V>            {
V>                fixed (Point* p = &this)
V>                {
V>                    MoveObject(Pointer.Box(p, typeof(Point*)), a, b);
V>                }
V>                Console.WriteLine("point from this: {0}.{1}", x, y);
V>            }
V>


V>Я правильно понимаю, что GC не может перемещать ValueType в куче пока выполняется любой из его методов (в данном случае если убрать fixed)?


ValueType может быть как на стеке, так и полем объекта. Он сам по себе в куче не может быть. Только его отбоксенговая копия.

Я же тебе привел пример правильного использования

 public void Move(int a, int b)
 {
     MoveObject(ref this, a, b);
     Console.WriteLine("point from this: {0}.{1}", x, y);
 }

 static void MoveObject(ref Point p, int a, int b)
 {
  
     p.x += a;
     p.y += b;
     Console.WriteLine("point from object: {0}.{1}", p.x, p.y);
 }



Для не статика


public void MoveObject(int a, int b)
 {
  
     this.x += a;
     this.y += b;
     Console.WriteLine("point from object: {0}.{1}", this.x, this.y);
 }


Почитай еще

ref locals и ref returns в C#: подводные камни производительности