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

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


person Puppy    schedule 03.07.2010    source источник


Ответы (4)


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

В этом и заключается идея «небезопасного» — «безопасность» проверяемых типов удаляется, и вы можете выполнять приведение от указателя одного типа к указателю другого типа без того, чтобы среда выполнения удерживала вас от выстрелите себе в ногу, если хотите, — очень похоже на 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 байтами за раз.

person codekaizen    schedule 03.07.2010

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

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

person egrunin    schedule 03.07.2010

Да, вы можете сделать точку указателя где угодно.

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

person Guffa    schedule 03.07.2010

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

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

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

person Chris Hutchinson    schedule 03.07.2010