我正在阅读ECMA-334,正如一位以编程为生的朋友所建议的那样.我在处理不安全代码的部分.虽然,我对他们所谈论的内容感到有点困惑.
C#下面的垃圾收集器可能通过在内存中移动对象来工作,但这种移动对于大多数C#开发人员来说是不可见的.对于通常满足于自动内存管理但有时需要细粒度控制或额外性能的开发人员,C#提供了编写"不安全"代码的能力.这样的代码可以直接处理指针类型和对象地址; 但是,C#要求程序员修复对象以暂时阻止垃圾收集器移动它们.从开发人员和用户的角度来看,这种"不安全"的代码功能实际上是一种"安全"功能.代码中的不安全代码应使用修饰符unsafe清楚地标记,因此开发人员不可能意外地使用不安全的语言功能,并且编译器和执行引擎一起工作以确保不安全的代码不能伪装成安全代码26 8 9BLanguage概述.这些限制将不安全代码的使用限制在代码受信任的情况下.
这个例子
using System;
class Test
{
static void WriteLocations(byte[] arr)
{
unsafe
{
fixed (byte* pArray = arr)
{
byte* pElem = pArray;
for (int i = 0; i < arr.Length; i++)
{
byte value = *pElem;
Console.WriteLine("arr[{0}] at 0x{1:X} is {2}",
i, (uint)pElem, value);
pElem++;
}
}
}
}
static void Main()
{
byte[] arr = new byte[] { 1, 2, 3, 4, 5 };
WriteLocations(arr);
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
在名为WriteLocations的方法中显示一个不安全的块,它修复了一个数组实例,并使用指针操作迭代元素.每个数组元素的索引,值和位置都写入控制台.一个可能的输出示例是:
Run Code Online (Sandbox Code Playgroud)arr[0] at 0x8E0360 is …