Подтвердить что ты не робот

Небезопасный код в С#

Каковы ограничения небезопасного кода на С#? Например, могу ли я делать практически произвольные приведения указателей и арифметику, как если бы я использовал C или С++?

4b9b3361

Ответ 1

Да. Все ставки отключены, когда небезопасно находится в игре.

Это идея "небезопасно" - что "безопасность" проверяемых типов удаляется, и вы можете отбрасывать указатель одного типа на указатель другого типа без времени выполнения, сохраняя вас от снимать себя в ногу, если вы этого хотите - очень похоже на C или С++.

Здесь приведен пример использования разных типов указателей в С#:

fixed (Byte* dstBytes = &currentImage[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).