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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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