Каковы ограничения небезопасного кода на С#? Например, могу ли я выполнять практически произвольные приведения указателей и арифметические операции, как если бы я использовал C или C++?
Небезопасный код на C#
Ответы (4)
да. Все ставки отключены, когда в игре небезопасно.
В этом и заключается идея «небезопасного» — «безопасность» проверяемых типов удаляется, и вы можете выполнять приведение от указателя одного типа к указателю другого типа без того, чтобы среда выполнения удерживала вас от выстрелите себе в ногу, если хотите, — очень похоже на C или C++.
Вот пример использования разных типов указателей в C#:
fixed (Byte* dstBytes = ¤tImage[0])
{
var dstBuffer = (Int64*)dstBytes;
const int blockCount = ImageSizeInBytes / sizeof(Int64);
for (var j = 0; j < blockCount; j++)
{
dstBuffer[j] = srcBuffer[j];
}
}
Обратите внимание, что тип массива — Byte[]
, но после того, как я получу Byte*
, я могу преобразовать его в Int64*
и работать с 8 байтами за раз.
Да, это все возможно. Вот учебник по небезопасному коду из MSDN. .
Всем тем, кто говорит, что использовать это — ужасная идея: да, но это не просто так. Мне пришлось использовать это (впервые) совсем недавно, получая данные веб-камеры через сторонний API, который возвращал Byte *
.
Да, вы можете сделать точку указателя где угодно.
Однако, поскольку ваша программа работает в виртуальном адресном пространстве, вы можете получить доступ только к той памяти, которая фактически существует в этом пространстве, т. е. вы не можете получить доступ к каким-либо другим процессам и не можете получить доступ к памяти, которая не была выделена.
Вы можете обратиться к следующей странице для получения дополнительной информации:
http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx
Небезопасный код позволяет объявлять указатели практически на любую примитивную переменную (фундаментальные типы); вам разрешено использовать типы указателей. Арифметика указателя основана на размере хранилища типа указателя, поэтому применение постинкремента или постдекремента к указателю увеличит адрес на sizeof(type).