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

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

13
задан Puppy 3 July 2010 в 22:03
поделиться

4 ответа

Да. Все ставки сделаны, когда в игре есть unsafe.

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

12
ответ дан 2 December 2019 в 00:02
поделиться

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

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

3
ответ дан 2 December 2019 в 00:02
поделиться

Дополнительную информацию можно найти на следующей странице:

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

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

0
ответ дан 2 December 2019 в 00:02
поделиться

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

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

1
ответ дан 2 December 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: