Сообщение Re[2]: Передать this в виде object от 14.03.2024 11:59
Изменено 14.03.2024 12:04 drVanо
Re[2]: Передать this в виде object
Здравствуйте, gandjustas, Вы писали:
G>Так не получится. ValueType отличается от ReferenceType тем, что хранится по месту. То есть переменная p хранится в стеке Main. А когда вы приовдите её к Object, то создаете копию структуры в куче и передаете ссылку на нее (операция называется boxing). Когда вы приводите object к Point, то создаете копию в стеке функции MoveObject, меняете её, а потом эта копия исчезает.
Да это все понятно. Вопрос как раз в том каким образом достать указатель на ValueType из this и затем через его представление изменять свойства структуры.
Есть вот такой вариант:
Я правильно понимаю, что GC не перенесет структуру в другое место пока работает метод Point::Move иначе я не могу себе представить будет выглядеть нативный код этого дела?
G>Так не получится. ValueType отличается от ReferenceType тем, что хранится по месту. То есть переменная p хранится в стеке Main. А когда вы приовдите её к Object, то создаете копию структуры в куче и передаете ссылку на нее (операция называется boxing). Когда вы приводите object к Point, то создаете копию в стеке функции MoveObject, меняете её, а потом эта копия исчезает.
Да это все понятно. Вопрос как раз в том каким образом достать указатель на ValueType из this и затем через его представление изменять свойства структуры.
Есть вот такой вариант:
public unsafe void Move(int a, int b)
{
fixed (Point* p = &this)
{
MoveObject(Pointer.Box(p, typeof(Point*)), a, b);
}
Console.WriteLine("point: {0}.{1}", x, y);
}
static unsafe void MoveObject(object obj, int a, int b)
{
Point* p = (Point*)Pointer.Unbox(obj);
p->x += a;
p->y += b;
Console.WriteLine("point: {0}.{1}", p->x, p->y);
}
Я правильно понимаю, что GC не перенесет структуру в другое место пока работает метод Point::Move иначе я не могу себе представить будет выглядеть нативный код этого дела?
Re[2]: Передать this в виде object
Здравствуйте, gandjustas, Вы писали:
G>Так не получится. ValueType отличается от ReferenceType тем, что хранится по месту. То есть переменная p хранится в стеке Main. А когда вы приовдите её к Object, то создаете копию структуры в куче и передаете ссылку на нее (операция называется boxing). Когда вы приводите object к Point, то создаете копию в стеке функции MoveObject, меняете её, а потом эта копия исчезает.
Да это все понятно. Вопрос как раз в том каким образом достать указатель на ValueType из this и затем через его представление изменять свойства структуры.
Есть вот такой вариант:
Я правильно понимаю, что GC не перенесет структуру в другое место пока работает метод Point::Move иначе я не могу себе представить будет выглядеть нативный код этого дела?
G>Так не получится. ValueType отличается от ReferenceType тем, что хранится по месту. То есть переменная p хранится в стеке Main. А когда вы приовдите её к Object, то создаете копию структуры в куче и передаете ссылку на нее (операция называется boxing). Когда вы приводите object к Point, то создаете копию в стеке функции MoveObject, меняете её, а потом эта копия исчезает.
Да это все понятно. Вопрос как раз в том каким образом достать указатель на ValueType из this и затем через его представление изменять свойства структуры.
Есть вот такой вариант:
public unsafe void Move(int a, int b)
{
fixed (Point* p = &this)
{
MoveObject(Pointer.Box(p, typeof(Point*)), a, b);
}
Console.WriteLine("point from this: {0}.{1}", x, y);
}
static unsafe void MoveObject(object obj, int a, int b)
{
Point* p = (Point*)Pointer.Unbox(obj);
p->x += a;
p->y += b;
Console.WriteLine("point from object: {0}.{1}", p->x, p->y);
}
Я правильно понимаю, что GC не перенесет структуру в другое место пока работает метод Point::Move иначе я не могу себе представить будет выглядеть нативный код этого дела?