CS5L14——unsafe

unsafe

Unity移动开发内涉及内容,这里将其补充到C#知识补充内,它本身不属于C#知识补充的课程

默认情况下,C#是不支持 指针 的,unsafe​ 关键词用于在C#表示不安全的上下文,
如果想要在C#中进行任何和指针相关的操作,就必须配合 unsafe​​ 关键词使用。

何为指针

指针(Pointer,简称ptr​)是计算机编程中一个重要的概念,它是一种特殊的数据类型,用于存储变量的内存地址。
简单来说,指针指向了一个变量在计算机内存中的存储位置指针就是地址,地址就是指针

每个变量在内存中都有一个地址,在编程中,通过定义指针变量,我们可以存储一个变量的地址,
这就使得我们可以通过间接的方式操作和修改变量,而不需要访问原始的变量名。

在公共语言运行时(CLR)中,不安全代码是指无法验证的代码。
C# 中的不安全代码不一定是危险的,只是 CLR 无法验证该代码的安全性。
因此,CLR 将仅执行完全信任的程序集中的不安全代码。
如果你使用不安全代码,你应该负责确保代码不会引发安全风险或指针错误

关于CLR是什么,详情请见:CS5L1——.NET相关知识

注意:unsafe​ 的使用虽然能让我们在C#中使用指针,但是会存在安全风险和稳定性风险,如果没有特殊需求,请尽量避免在C#中使用 unsafe

unsafe的基本使用

如果想要在Unity中正常使用C#中的unsafe​关键词进行程序编写,
我们必须在Unity的 Player Settings 中的 Other Settings 中将 Allow ‘unsafe’ Code 选项勾选上

image

勾选该选项后,我们就可以在Unity中使用unsafe​关键词了。

unsafe的基本用法

  1. 用于修饰函数

    1
    2
    3
    4
    5
    6
    7
    //unsafe 修饰函数后,函数参数可以使用指针
    public unsafe void CopyInfo(byte* src, byte* dst, int count)
    {
    //函数内部也可以使用指针
    int i = 3;
    int* testInt = &i;
    }
  2. 用于修饰代码块

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void TestFun()
    {
    unsafe
    {
    int i = 3;
    int* testInt = &i;
    print("值为:" + i);
    print("地址是:" + (int)testInt);
    }
    }
  3. 用于修饰成员变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class TestClass
    {
    //unsafe 修饰成员变量 可以声明指针成员
    public unsafe int* p;

    //在非unsafe的语句块中不能直接使用
    public void TestFun()
    {
    int i = 3;
    //p = &i; //本句会报错
    }

    //还是需要在unsafe声明的语句块中使用
    public unsafe void TestFun()
    {
    int i = 3;
    p = &i;
    }
    }
  4. 用于修饰类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //通过unsafe修饰类,可以在类中随意使用指针
    public unsafe class TestClass
    {
    public int* p;
    public byte* TestFun(byte* array)
    {
    return null;
    }
    }