Каковы ограничения небезопасного кода в C#? Например, я могу сделать фактически произвольные броски указателя и арифметику, как будто я использовал C или C++?
Да. Все ставки сделаны, когда в игре есть unsafe.
В этом и заключается идея "unsafe" - что "безопасность" проверяемых типов удалена, и вы можете приводить указатель одного типа к указателю другого типа без того, чтобы время выполнения удерживало вас от выстрела себе в ногу, если вы того пожелаете - очень похоже на 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, который возвращал байт *
.
Дополнительную информацию можно найти на следующей странице:
http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx
Небезопасный код предоставляет возможность объявлять указатели практически на любую примитивную переменную (фундаментальные типы); вам разрешено выполнять приведение между типами указателей.Арифметика указателя основана на размере памяти типа указателя, поэтому применение постинкремента или постдекремента к указателю увеличит адрес на sizeof (type).
Да, вы можете сделать указатель указывающим куда угодно.
Однако, поскольку ваша программа работает в виртуальном адресном пространстве, вы можете получить доступ только к той памяти, которая реально существует в этом пространстве, т.е. вы не можете получить доступ к другим процессам, и вы не можете получить доступ к памяти, которая не была выделена.