unsafe (C# Reference)

关键字 unsafe 表示不安全的上下文,涉及指针的任何作都需要此上下文。 有关详细信息,请参阅 不安全代码和指针

C# 语言参考记录了 C# 语言的最新发布版本。 它还包含即将发布的语言版本公共预览版中功能的初始文档。

本文档标识了在语言的最后三个版本或当前公共预览版中首次引入的任何功能。

小窍门

若要查找 C# 中首次引入功能时,请参阅 有关 C# 语言版本历史记录的文章。

unsafe 类型或成员的声明中使用修饰符。 类型或成员的整个文本范围是不安全的上下文。 例如,以下方法使用 unsafe 修饰符声明:

unsafe static void FastCopy(byte[] src, byte[] dst, int count)
{
    // Unsafe context: can use pointers here.
}

不安全上下文的范围从参数列表扩展到方法的末尾,因此还可以在参数列表中使用指针:

unsafe static void FastCopy ( byte* ps, byte* pd, int count ) {...}

还可以使用不安全块来启用此块内不安全代码的使用。 例如:

unsafe
{
    // Unsafe context: can use pointers here.
}

若要编译不安全的代码,必须指定 AllowUnsafeBlocks 编译器选项。 公共语言运行时无法验证不安全的代码。

注释

C# 15 中提供的 内存安全 预览功能缩小了需要 unsafe 上下文的操作范围。 unsafe创建指针、fixed语句、将表达式转换为stackalloc指针以及对非托管类型使用sizeof,不再需要上下文。 只有访问指向内存的操作(如指针间接)仍需要 unsafe 上下文。 同一预览版还添加了一个 unsafe(expression) 表单,用于为单个表达式建立不安全上下文,对于无法显示块的位置 unsafe ,例如字段初始值设定项或 catch 筛选器。 有关详细信息,请参阅 不安全表达式。 预览版还为成员提供了 unsafe 一个新的含义:编译器将其识别为标记成员 需要不安全。 尚未实施该义务的调用方强制实施,因此,标记成员 unsafe 目前对其调用方没有影响。 有关详细信息,请参阅 调用方不安全的成员

示例:

// compile with: -unsafe
class UnsafeTest
{
    // Unsafe method: takes pointer to int.
    unsafe static void SquarePtrParam(int* p)
    {
        *p *= *p;
    }

    unsafe static void Main()
    {
        int i = 5;
        // Unsafe method: uses address-of operator (&).
        SquarePtrParam(&i);
        Console.WriteLine(i);
    }
}
// Output: 25

C# 语言规范

有关详细信息,请参阅 C# 语言规范中的不安全代码。 语言规范是 C# 语法和用法的明确来源。

另请参阅