Re[3]: Передать this в виде object
От: Sinclair Россия https://github.com/evilguest/
Дата: 15.03.24 15:23
Оценка:
Здравствуйте, drVanо, Вы писали:

V>Здравствуйте, gandjustas, Вы писали:


G>>Так не получится. ValueType отличается от ReferenceType тем, что хранится по месту. То есть переменная p хранится в стеке Main. А когда вы приовдите её к Object, то создаете копию структуры в куче и передаете ссылку на нее (операция называется boxing). Когда вы приводите object к Point, то создаете копию в стеке функции MoveObject, меняете её, а потом эта копия исчезает.


V>Да это все понятно. Вопрос как раз в том каким образом достать указатель на ValueType из this и затем через его представление изменять свойства структуры.

this — это и есть "указатель" на ValueType.

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>            static unsafe void MoveObject(object obj, int a, int b)
V>            {
V>                Point* p = (Point*)Pointer.Unbox(obj);
V>                p->x += a;
V>                p->y += b;
V>                Console.WriteLine("point from object: {0}.{1}", p->x, p->y);
V>            }
V>

Вариант есть, но он вам не нужен.
V>Я правильно понимаю, что GC не перенесет структуру в другое место пока работает метод Point::Move иначе я не могу себе представить будет выглядеть нативный код этого дела?
Нет, GC не перенесёт структуру в другое место, пока исполнение не выйдет из блока fixed{}. Есть там метод Move или нет — неважно.
Непонятно, зачем вы делаете эту ерунду.
1. Если вы решили пердолиться с поинтерами, то можно просто вот так:
            public unsafe void Move(int a, int b)
            {
                fixed (Point* p = &this)
                {
                    MoveObject(p, a, b);
                }
                Console.WriteLine("point from this: {0}.{1}", x, y);
            }

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

2. По-прежнему непонятно, зачем пердолиться с указателями и ансейфом, когда можно просто
            public void Move(int a, int b)
            {
                 MoveObject(ref this, a, b);
            }

            static unsafe 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);
            }



Задачу-то вы какую решаете?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.