Небезопасный код в C # - PullRequest
       18

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

13 голосов
/ 04 июля 2010

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

Ответы [ 4 ]

11 голосов
/ 04 июля 2010

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

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

Вот пример использования другого указателятипы в 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 байтами за раз.

3 голосов
/ 04 июля 2010

Да, это все возможно.Вот учебник по небезопасному коду от MSDN.

Для всех, кто говорит, как использовать это ужасная идея: да, но она есть по причине.Я должен был использовать это (впервые) только недавно, получая данные веб-камеры через сторонний API, который возвратил Byte *.

1 голос
/ 04 июля 2010

Да, вы можете указать указатель в любом месте.

Однако, поскольку ваша программа работает в виртуальном адресном пространстве, вы можете получить доступ только к памяти, которая фактически существует в этом пространстве, т.е. вы можетенет доступа к другим процессам, и вы не можете получить доступ к памяти, которая не была выделена.

0 голосов
/ 04 июля 2010

Вы можете обратиться к следующей странице для получения дополнительной информации:

http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx

Небезопасный код предоставляет возможность объявлять указатели практически для любой примитивной переменной (фундаментальные типы); вам разрешено приводить между типами указателей. Арифметика указателя основана на размере хранилища типа указателя, поэтому применение к указателю пост-инкремента или пост-декремента увеличит адрес на sizeof (тип).

...