Решено | Как использовать не безопасный код на C#?

Приветствую всех, сегодня я покажу как можно использовать небезопасный код в сишарпе.

В небезопасном коде или другими словами неуправляемого кода можно объявлять и использовать указатели. Но вопрос в том, почему мы пишем неуправляемый код? Если мы хотим написать код, который взаимодействует с операционной системой, или хотим получить доступ к памяти отображаемого устройства или хотите реализовать  критический алгоритм, использование указателя может дать много преимуществ.

Но есть некоторые недостатки использования указателей. Если указатели были выбраны 32-битных машина во время компиляции, то код будет ограничено 4gig адресного пространства, даже если бы это было работать на 64 битной машине. Если указатели были выбраны во время компиляции 64 бита, то код не может быть запущен на 32 битной машине.

Управляемый код является то, что код, который выполняется под контролем CLR. CLR отвечает за различные служебные задачи, как:

  • управление памятью для объектов
  • проверка исполнительского типа
  • делает сбор мусора

Пользователь полностью изолирован из упомянутых выше задач. Пользователь не манипулирует памятью напрямую, потому что это делается с помощью CLR.

С другой стороны, неуправляемый код, это код , который выполняет вне контекста CLR. Лучшим примером этого является, наши традиционные Win32 DLL , как kernel32.dll , user32.dll , и COM — компоненты , установленные в нашей системе. Как они выделяют память для их использования, как освобождается память, как (если таковые имеются) тип проверки занимает места некоторые из задач, которые осуществляются ими самостоятельно. Программа типичной C ++ , который выделяет память для указателя символов является еще одним примером неуправляемого кода , потому что вы , как программист , несут ответственность за:

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

Если вы заметили, вся эта забота производится с помощью CLR, как описано выше, избавляя программиста от бремени.

Написание небезопасного кода требует использования двух специальных ключевых слов: unsafeи fixed. Если вспомнить, что есть три вида операторов указателя:

  • *
  • &
  • ->

В C # можно написать небезопасный код с модификатором unsafe. Все небезопасный код должен быть четко обозначен с unsafeмодификатором.

Теперь давайте посмотрим на первый пример

В этом примере я использую указатель, однако при компиляции, компилятор выдает ошибку.

Все дело в том что нам необходимо использовать небезопасный модификатор метода unsafe

Однако не обязательно определять unsafeмодификатор с помощью метода. Мы можем определить блок небезопасного кода. Давайте изменим программу немного больше.

Как получить значение указателей?

В следующем примере мы рассмотрим код и возможность получить значения из указателей.

Мы можем использовали ToString()метод чтобы получить данные из указателя.

В этой программе небезопасный методtestFun()вызывает метод swap() метод производит перестановку значения двух переменных , проходящих по ссылке. Теперь измените программу немного.

В следующем примере мы можем предыдущую программу модифицировать иначе:

Следующая программа отображает квадрат чисел от 0 до 9.

Давайте изменим программу немного и будем передавать массив в качестве параметра функции.

Теперь давайте изменим программу и попытаемся получить значение массива из указателя, а не из индекса.

Вот в этой программе мы пытаемся получить доступ к значению массива из , *(iArray + iIndex) а не iArray[iIndex]. Но программа выдает сообщение об ошибке.

Все дело в том что в C # int*и in[] относится не к одному и тому же. Чтобы понять это давайте посмотрим еще одну программу.

Есть два различных типа переменных в этой программе. Во- первых, переменная iArray объявляется массивом и вторая переменная iPointerявляется переменной указателя. Теперь я собираюсь увеличивать обе переменных. Мы можем увеличивать переменную указатель , поскольку он не фиксируется в памяти , но мы не можем увеличивать iArray, потому что начальный адрес массива хранится в iArrayи если бы нам позволили увеличить это , то мы потеряли бы начальный адрес массива.

Выход программы является ошибкой.

Чтобы получить доступ к элементу массива с помощью указателя мы должны зафиксировать указатель , поэтому он не может быть увеличен. C # использует fixedзарезервное слово , чтобы сделать это.

Мы можем использовать тот же метод, чтобы передать массив в функцию, которая принимает указатель в качестве параметра.

Выход программы является такой же, как и предыдущий. Если попытаться получить доступ за пределы массива, то он будет сообщать об этом.

Здесь мы попытаемся прочитать 20 элементов из массива, но есть только 10 элементов в массиве, так он будет выводить сообщение после вывода элементов массива.

Вот pPointэто указатель экземпляра класса Point. Мы можем получить доступ к элементу его с помощью ->оператора.

 

Обновлено: 19.10.2018 — 12:17

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.