c# 指標unsafe/fixed -- 【一】
1.1 概述
unsafe關鍵字表示不安全上下文,該上下文是任何涉及指標的操作所必需的。可以在屬性、方法、類的宣告中使用unsafe修飾符,此時型別或成員的整個正文範圍均被視為不安全上下文。
fixed語句用於禁止垃圾回收器重定位可移動的變數,Fixed還可用於建立固定大小的緩衝區,fixed 語句只能出現在不安全的上下文中。
但在C#中使用指標時只能操作struct,不能操作class,不能在泛型型別程式碼中使用未定義型別的指標。
在C#中編譯不安全程式碼時,必須指定/unsafe編譯器選項,否則無法通過公共語言執行庫驗證不安全程式碼,選擇專案—屬性—生成標籤,勾選 “允許不安全程式碼”選項即可。
1.2 unsafe
可以方法或屬性上加入unsafe關鍵字:
C# Code 1 private unsafe void Fun(byte* ps, byte* pd, int count)
也可在class或struct上加上unsafe關鍵字:
C# Code 1 public partial unsafe class Demo
還可以使用不安全塊,從而可以使用該塊內的不安全程式碼。例如:
C# Code 1 2 3 4 unsafe { // Unsafe context: can use pointers here. }
完整示例如:
C# Code 1 2 3 4 5 6 7 8 9 10 11 12 unsafe 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 fixed (int* p = arr) ... // equivalent to p = &arr[0] fixed (char* p = str) ... // equivalent to p = &str[0]
只要指標的型別相同,就可以初始化多個指標:
C# Code 1 fixed (byte* ps = srcarray, pd = dstarray) {...}
要初始化不同型別的指標,只需巢狀fixed 語句:
C# Code 1 2 3 4 5 6 7 fixed (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 public unsafe void Fun() { int *p = stackalloc int[10]; for (int i = 0; i < 10; i++) { p[i] = 2 * i + 2; } } --------------------- 作者:傲十郎 來源:CSDN 原文:https://blog.csdn.net/aoshilang2249/article/details/37819183 版權宣告:本文為博主原創文章,轉載請附上博文連結!