C # – Mã không an toàn


C # cho phép sử dụng các biến con trỏ trong một hàm của khối mã khi nó được đánh dấu bởi không an toàn bổ nghĩa. Các mã không an toàn hoặc mã không được quản lý là một khối mã sử dụng con trỏ Biến đổi.

Ghi chú – Để thực thi các chương trình được đề cập trong chương này tại codingground, vui lòng đặt tùy chọn biên dịch trong Dự án >> Tùy chọn biên dịch >> Lệnh biên dịch đến

mcs *.cs -out:main.exe -unsafe"

Con trỏ

Một con trỏ là một biến có giá trị là địa chỉ của một biến khác, tức là địa chỉ trực tiếp của vị trí bộ nhớ. tương tự với bất kỳ biến hoặc hằng nào, bạn phải khai báo một con trỏ trước khi có thể sử dụng nó để lưu trữ bất kỳ địa chỉ biến nào.

Hình thức chung của khai báo con trỏ là:

type *var-name;

Sau đây là các khai báo con trỏ hợp lệ:

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

Ví dụ sau minh họa việc sử dụng con trỏ trong C #, sử dụng công cụ sửa đổi không an toàn:

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();
      }
   }
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Data is: 20
Address is: 99215364

Thay vì khai báo toàn bộ phương thức là không an toàn, bạn cũng có thể khai báo một phần của mã là không an toàn. Ví dụ trong phần sau đây cho thấy điều này.

Lấy giá trị dữ liệu bằng con trỏ

Bạn có thể truy xuất dữ liệu được lưu trữ tại vị trí được tham chiếu bởi biến con trỏ, bằng cách sử dụng ToString () phương pháp. Ví dụ sau đây chứng minh điều này –

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();
      }
   }
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

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

Truyền con trỏ làm tham số cho phương thức

Bạn có thể truyền một biến con trỏ cho một phương thức dưới dạng tham số. Ví dụ sau minh họa điều này:

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();
      }
   }
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

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

Truy cập các phần tử mảng bằng con trỏ

Trong C #, tên mảng và con trỏ đến kiểu dữ liệu giống với dữ liệu mảng, không cùng kiểu biến. Ví dụ, int * p và int[] p, không cùng loại. Bạn có thể tăng biến con trỏ p vì nó không cố định trong bộ nhớ nhưng địa chỉ mảng được cố định trong bộ nhớ và bạn không thể tăng giá trị đó.

Do đó, nếu bạn cần truy cập dữ liệu mảng bằng biến con trỏ, như chúng ta thường làm trong C hoặc C ++ (vui lòng kiểm tra: C Pointers), bạn cần sửa con trỏ bằng cách sử dụng đã sửa từ khóa.

Ví dụ sau đây chứng minh điều này –

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();
      }
   }
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

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

Biên dịch mã không an toàn

Để biên dịch mã không an toàn, bạn phải chỉ định / không an toàn chuyển đổi dòng lệnh với trình biên dịch dòng lệnh.

Ví dụ: để biên dịch một chương trình có tên prog1.cs có chứa mã không an toàn, từ dòng lệnh, hãy đưa ra lệnh:

csc /unsafe prog1.cs

Nếu bạn đang sử dụng Visual Studio IDE thì bạn cần cho phép sử dụng mã không an toàn trong thuộc tính dự án.

Để làm điều này –