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 unsafebổ nghĩa. Cácunsafe code hoặc mã không được quản lý là một khối mã sử dụng pointer Biến đổi.
Note- Để 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 thành
mcs *.cs -out:main.exe -unsafe"
Con trỏ
A pointerlà 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ự như 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.
Dạng 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ộ một 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ỏ, 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
Chuyể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 kiểu. Bạn có thể tăng giá trị 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ụngfixed 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 /unsafe 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 các thuộc tính của dự án.
Để làm điều này -
Mở project properties bằng cách nhấp đúp vào nút thuộc tính trong Trình khám phá giải pháp.
Bấm vào Build chuyển hướng.
Chọn tùy chọn "Allow unsafe code".