Unsafe.AsPointer и преобразуемые типы значений, передаваемые по ссылкеC#

Место общения программистов C#
Anonymous
Unsafe.AsPointer и преобразуемые типы значений, передаваемые по ссылке

Сообщение Anonymous »

Я пишу здесь код, и мне нужно подумать, и, вероятно, я ошибаюсь в своем предположении, поэтому мне нужна другая пара глаз и мнений.
У меня есть это:
void Write(Buffer buffer, ref readonly T value, int offset)
where T : unmanaged
{
byte* valuePtr = (byte *)Unsafe.AsPointer(in value);
NativeMemory.Copy(valuePtr, buffer.Pointer + offset, sizeof(T));
}

Теперь должно безопасно делать это, потому что:
  • Это преобразуемый тип значения (обеспечиваемый неуправляемым ограничением на T).
  • Поскольку это параметр, он должен находиться в стеке и не должен перемещаться сборщиком мусора (поэтому Я предполагаю)
Итак, если вышеизложенное верно, то использовать Unsafe.AsPointer здесь должно быть безопасно, верно? Не могли бы вы сказать мне, на правильном ли я пути или я что-то упускаю?
Я знаю, что могу использовать фиксированный. Но мне больше интересно узнать, прав ли я в своих мыслях на данный момент.
fixed версия:
void Write(Buffer buffer, ref readonly T value, int offset)
where T : unmanaged
{
fixed (T* valuePtr = &value)
{
NativeMemory.Copy(valuePtr, (byte*)buffer.Pointer + offset, sizeof(T));
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... sed-by-ref

Вернуться в «C#»