Сообщение Re[5]: Передать this в виде object от 15.03.2024 11:22
Изменено 15.03.2024 11:26 Serginio1
Re[5]: Передать this в виде object
Здравствуйте, drVanо, Вы писали:
V>>>Дак это вы просто копируете содержимое копии обратно в this
S>>Так в этом и заключается боксинг унбоксинг.
S>>Приведя структуру к объекту ты создаешь новый объект. Изменяешь его и должен обратно его присвоить структуре.
V>А хотелось бы без копирования.
V>Я тут задавал вопрос чуть выше:
V>
V>Я правильно понимаю, что GC не может перемещать ValueType в куче пока выполняется любой из его методов (в данном случае если убрать fixed)?
ValueType может быть как на стеке, так и полем объекта. Он сам по себе в куче не может быть. Только его отбоксенговая копия.
Я же тебе привел пример правильного использования
Для не статика
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);
}
Re[5]: Передать this в виде object
Здравствуйте, drVanо, Вы писали:
V>>>Дак это вы просто копируете содержимое копии обратно в this
S>>Так в этом и заключается боксинг унбоксинг.
S>>Приведя структуру к объекту ты создаешь новый объект. Изменяешь его и должен обратно его присвоить структуре.
V>А хотелось бы без копирования.
V>Я тут задавал вопрос чуть выше:
V>
V>Я правильно понимаю, что GC не может перемещать ValueType в куче пока выполняется любой из его методов (в данном случае если убрать fixed)?
ValueType может быть как на стеке, так и полем объекта. Он сам по себе в куче не может быть. Только его отбоксенговая копия.
Я же тебе привел пример правильного использования
Для не статика
Почитай еще https://habr.com/ru/companies/microsoft/articles/423061/
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/