.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
相关产品推荐
相关产品推荐

