Cool_Breeze 发表于 2021-3-19 14:13

C# 学习笔记不安全的代码(指针) unsafe

本帖最后由 Cool_Breeze 于 2021-3-19 14:36 编辑

using System;

class GenericExercise
{
    delegate void GenericDelegate<T>(ref T a, ref T b);
    static unsafe void Main() // 注意 unsafe
    {
      int[] a = {1, 2, 3};
      int[] b = {4, 5, 6};
      
      // fixed 语句可防止垃圾回收器重新定位可移动的变量。 fixed 语句仅允许存在于不安全的上下文中。 还可以使用 fixed 关键字创建固定大小的缓冲区。
      fixed(int* pa = &a, pb = &b)
      {
            int temp;
            for (int i=0; i<a.Length; i++) // 交换值
            {
                temp = *(pa +i);
                *(pa +i) = *(pb +i);
                *(pb +i) = temp;
            }
      }
      
      foreach (var i in a) Console.WriteLine(i); // 4, 5, 6
      foreach (var i in b) Console.WriteLine(i); // 1, 2, 3
      
      string str = "52破解"; // string str 就是一个 char 类型列表的首地址
      fixed(char* pstr = str)
      {
            for (int i=0; i<str.Length; i++)
                Console.WriteLine(*(pstr+i)); // 5 2 破 解
      };
      
      // 结构体
      Point point = new Point(){x=111,y=222};
      Point* p = &point; // 不能使用fixed语句获取已固定表达式的地址, 这里直接赋值
      p->x = 333;
      Console.WriteLine(p->x); // 333
      Console.WriteLine(p->y); // 222
      
      // 枚举
      Color color = Color.Red;
      Color* colorp = &color;
      Console.WriteLine(*colorp); // Red
      
      Class n = new Class(){x=a};
      fixed(int* pn = &n.x)
      {
            for (int i=0; i<n.x.Length; i++)
                Console.WriteLine(*(pn+i));// 4 5 6
      };
      // Class* pn // 无法获取托管类型的地址、大小或声明指向托管类型的指针
    }
   
    struct Point
    {
      public int x;
      public int y;
    }
   
    enum Color
    {
      Red,
      Blue,
      Green
    }
   
    sealed class Class
    {
      public int[] x;
    }
}

Laugher_ 发表于 2021-3-22 15:39

unsafe。。
页: [1]
查看完整版本: C# 学习笔记不安全的代码(指针) unsafe