You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6中编写unsafe代码块的方法及项目启用配置

在.NET 6 C#项目中使用Unsafe代码

一、配置项目支持Unsafe代码

1. 通过Visual Studio界面配置

  • 右键项目 → 选择「属性」
  • 切换到「生成」选项卡
  • 在「常规」区域找到「允许不安全代码」,勾选该选项
  • 保存设置,项目会自动重新生成

2. 手动编辑.csproj文件

打开项目的.csproj文件,在<PropertyGroup>节点中添加<AllowUnsafeBlocks>true</AllowUnsafeBlocks>:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
  </PropertyGroup>
</Project>

保存文件后,项目会自动加载配置变更。

3. 使用.NET CLI配置

在项目根目录执行以下命令临时启用unsafe编译:

dotnet build /p:AllowUnsafeBlocks=true

若要永久生效,优先修改.csproj文件。

二、编写Unsafe代码的方法

1. Unsafe代码块

用unsafe关键字标记代码块,块内可直接使用指针操作:

using System;

class Program
{
    static void Main()
    {
        int number = 10;
        // 开启unsafe上下文
        unsafe
        {
            int* ptr = &number;
            Console.WriteLine($"变量地址: {(long)ptr:X}");
            Console.WriteLine($"变量值: {*ptr}");
            // 通过指针修改原变量的值
            *ptr = 20;
        }
        Console.WriteLine($"修改后的变量值: {number}");
    }
}

2. Unsafe方法

直接将整个方法标记为unsafe,方法内所有代码默认支持指针操作:

using System;

class Program
{
    static unsafe void ModifyValue(int* ptr, int newValue)
    {
        *ptr = newValue;
    }

    static void Main()
    {
        int num = 5;
        unsafe
        {
            ModifyValue(&num, 15);
        }
        Console.WriteLine(num); // 输出15
    }
}

3. 固定大小缓冲区(Fixed-Size Buffers)

在unsafe上下文里可定义固定大小的缓冲区,常用于和非托管代码交互:

unsafe struct MyBuffer
{
    public fixed byte Data[10]; // 固定长度的字节缓冲区
}

class Program
{
    static void Main()
    {
        unsafe
        {
            MyBuffer buffer;
            // 给缓冲区赋值
            for (int i = 0; i < 10; i++)
            {
                buffer.Data[i] = (byte)i;
            }
            // 通过指针遍历缓冲区
            byte* ptr = buffer.Data;
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(*(ptr + i));
            }
        }
    }
}

注意事项

  • Unsafe代码会绕过C#的类型安全检查,需警惕内存泄漏、野指针、越界访问等问题
  • 仅在高性能场景、非托管代码交互等必要场景下使用Unsafe代码
  • 指针操作时务必做好内存边界检查,避免破坏程序内存结构

内容的提问来源于stack exchange,提问作者Ali Aslani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 17:10:25