C# 默認安全模式下禁止直接內存操作。標記 unsafe 區塊可使用指針,實現高性能互操作或底層優化。
type *varName; // 如 int *p, double *d, char *c
僅允許在 unsafe 上下文中使用:
unsafe {
int var = 20;
int* p = &var;
Console.WriteLine($"值: {var}, 位址: {(int)p}");
}
不必標記整個方法,可僅標記片段:
public static void Main() {
unsafe {
int var = 20;
int* p = &var;
Console.WriteLine(p->ToString()); // 解引用獲取值
}
}
public unsafe void Swap(int* a, int* b) {
int t = *a; *a = *b; *b = t;
}
public static void Main() {
int x=10, y=20;
Swap(&x, &y); // x=20, y=10
}
C# 數組在內存可移動(GC 壓縮),需 fixed 鎖定:
int[] arr = {10, 100, 200};
fixed (int* ptr = arr) {
for (int i=0; i<3; i++) {
Console.WriteLine($"arr[{i}] 位址: {(int)(ptr+i)}, 值: {*(ptr+i)}");
}
}
csc /unsafe Program.cs警告: 不安全代碼繞過 CLR 內存安全機制,可能導致內存洩漏、類型安全違規、GC 錯誤。僅在性能關鍵路徑、互操作非托管庫時使用,並嚴格審查。