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