1. 程式人生 > >c# 指標unsafe/fixed -- 【一】

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  版權宣告:本文為博主原創文章,轉載請附上博文連結!