標籤:style blog http color os ar 使用 for strong
指標C#unsafefixed
目錄(?)[-]
- 概述
- unsafe
- fixed
1.1 概述
unsafe關鍵字表示不安全上下文,該上下文是任何涉及指標的操作所必需的。可以在屬性、方法、類的聲明中使用unsafe修飾符,此時類型或成員的整個本文範圍均被視為不安全上下文。
fixed語句用于禁止記憶體回收行程重定位可移動的變數,Fixed還可用於建立固定大小的緩衝區,fixed 語句只能出現在不安全的上下文中。
但在C#中使用指標時只能操作struct,不能操作class,不能在泛型型別代碼中使用未定義類型的指標。
在C#中編譯不安全的程式碼時,必須指定/unsafe編譯器選項,否則無法通過公用語言運行庫驗證不安全的程式碼,選擇項目—屬性—產生標籤,勾選 “允許不安全的程式碼”選項即可。
1.2 unsafe
可以方法或屬性上加入unsafe關鍵字:
C# Code
1
|
|
unsafe void Fun(byte* ps, byte* pd, int count) |
也可在class或struct上加上unsafe關鍵字:
C# Code
還可以使用不安全塊,從而可以使用該塊內的不安全的程式碼。例如:
C# Code
1 2 3 4
|
|
// Unsafe context: can use pointers here. } |
完整樣本如:
C# Code
1 2 3 4 5 6 7 8 9 10 11 12
|
|
static void SquarePtrParam(int *p) { *p *= *p; }
unsafe static void Main() { int i = 5; SquarePtrParam(&i); Console.WriteLine(i); }
|
1.3 fixed
fixed語句可用於設定指向託管變數的指標並在statement 執行期間“釘住”該變數。如果沒有fixed語句,則指向可移動託管變數的指標的地址可變,因為記憶體回收可能不可預知地重定位變數。
C#編譯器只允許在fixed 語句中分配指向託管變數的指標,但無法修改在fixed語句中初始化的指標。
可以用數組或字串的地址初始化指標:
C# Code
1 2
|
|
int* p = arr) ... // equivalent to p = &arr[0] fixed (char* p = str) ... // equivalent to p = &str[0] |
只要指標的類型相同,就可以初始化多個指標:
C# Code
1
|
|
byte* ps = srcarray, pd = dstarray) {...} |
要初始化不同類型的指標,只需嵌套fixed 語句:
C# Code
1 2 3 4 5 6 7
|
|
int* p1 = &p.x) { fixed (double* p2 = &array[5]) { // Do something with p1 and p2. } } |
完整樣本:
C# Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
|
class Point { public int x, y; }
class FixedTest { unsafe static void SquarePtrParam (int *p) { *p *= *p; }
unsafe static void Main() { Point pt = new Point(); pt.x = 5; pt.y = 6;
fixed (int *p = &pt.x) { SquarePtrParam (p); }
Console.WriteLine ("{0} {1}", pt.x, pt.y); } } |
在不安全模式中,可以在堆棧上分配記憶體,而堆棧不受記憶體回收的制約,因此不需要被鎖定,如棧記憶體(棧記憶體開闢快速高效但資源有限):
C# Code
1 2 3 4 5 6 7 8
|
|
unsafe void Fun() { int *p = stackalloc int[10]; for (int i = 0; i < 10; i++) { p[i] = 2 * i + 2; } } |
c# 指標unsafe/fixed -- 【一】