Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

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

C# позволяет использовать переменные-указатели в функции блока кода, когда он помечен как небезопасный модификатор. Небезопасный код или неуправляемый код представляет собой блок кода, использующий указатель переменная.

Указатели

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

Общая форма объявления указателя —

type *var-name;

Ниже приведены допустимые объявления указателя —

int    *ip;    /* pointer to an integer */
double *dp;    /* pointer to a double */
float  *fp;    /* pointer to a float */
char   *ch     /* pointer to a character */

Следующий пример иллюстрирует использование указателей в C# с использованием модификатора unsafe -

using System;

namespace UnsafeCodeApplication {
   class Program {
      static unsafe void Main(string[] args) {
         int var = 20;
         int* p = &var;
         
         Console.WriteLine("Data is: {0} ",  var);
         Console.WriteLine("Address is: {0}",  (int)p);
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код был скомпилирован и выполнен, он дает следующий результат —

Data is: 20
Address is: 99215364

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

Получение значения данных с помощью указателя

Вы можете получить данные, хранящиеся в расположении, на которое ссылается переменная указателя, используя функцию ToString(). метод. Следующий пример демонстрирует это —

using System;

namespace UnsafeCodeApplication {
   class Program {
      public static void Main() {
         unsafe {
            int var = 20;
            int* p = &var;
            
            Console.WriteLine("Data is: {0} " , var);
            Console.WriteLine("Data is: {0} " , p->ToString());
            Console.WriteLine("Address is: {0} " , (int)p);
         }
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код был скомпилирован и выполнен, он дает следующий результат —

Data is: 20
Data is: 20
Address is: 77128984

Передача указателей в качестве параметров методам

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

using System;

namespace UnsafeCodeApplication {
   class TestPointer {
      public unsafe void swap(int* p, int *q) {
         int temp = *p;
         *p = *q;
         *q = temp;
      }
      public unsafe static void Main() {
         TestPointer p = new TestPointer();
         int var1 = 10;
         int var2 = 20;
         int* x = &var1;
         int* y = &var2;
         
         Console.WriteLine("Before Swap: var1:{0}, var2: {1}", var1, var2);
         p.swap(x, y);

         Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2);
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —

Before Swap: var1: 10, var2: 20
After Swap: var1: 20, var2: 10

Доступ к элементам массива с помощью указателя

В C# имя массива и указатель на тип данных, такой же, как данные массива, не являются одним и тем же типом переменной. Например, int *p и int[] p не одного типа. Вы можете увеличить переменную-указатель p, потому что она не фиксирована в памяти, но адрес массива фиксирован в памяти, и вы не можете увеличить это.

Поэтому, если вам нужно получить доступ к данным массива с помощью переменной-указателя, как мы традиционно делаем в C или C++ (пожалуйста, проверьте:указатели C), вам нужно зафиксировать указатель с помощью fixed ключевое слово.

Следующий пример демонстрирует это —

using System;

namespace UnsafeCodeApplication {
   class TestPointer {
      public unsafe static void Main() {
         int[]  list = {10, 100, 200};
         fixed(int *ptr = list)
         
         /* let us have array address in pointer */
         for ( int i = 0; i < 3; i++) {
            Console.WriteLine("Address of list[{0}]={1}",i,(int)(ptr + i));
            Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i));
         }
         
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код был скомпилирован и выполнен, он дает следующий результат —

Address of list[0] = 31627168
Value of list[0] = 10
Address of list[1] = 31627172
Value of list[1] = 100
Address of list[2] = 31627176
Value of list[2] = 200

Компиляция небезопасного кода

Для компиляции небезопасного кода необходимо указать параметр /unsafe переключатель командной строки с компилятором командной строки.

Например, чтобы скомпилировать программу с именем prog1.cs, содержащую небезопасный код, из командной строки введите команду -

csc /unsafe prog1.cs

Если вы используете Visual Studio IDE, вам необходимо разрешить использование небезопасного кода в свойствах проекта.

Для этого —


Язык C

  1. Цветовые коды резисторов
  2. Цветовые коды подключения
  3. Указатели C++ с примерами
  4. Указатели в C:что такое указатели в программировании на C? Типы
  5. C — указатели
  6. Коды Data Matrix против QR-кодов
  7. М-коды Haas Mill
  8. М-коды Mach3
  9. M-коды – Викторина по программированию ЧПУ
  10. G-коды — тест по программированию ЧПУ