unsafe
关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。有关更多信息,请参见
不安全代码和指针(C# 编程指南)
。
可以在类型或成员的声明中使用 unsafe 修饰符。因此,类型或成员的整个正文范围均被视为不安全上下文。
若要编译不安全代码,必须指定 /unsafe 编译器选项。无法通过公共语言运行库验证不安全代码。
Fixed
另一种不常见的关键字是Fixed,它只能在不安全的C#代码块中使用。Fixed语句在个固定的内存地址设置一个指针,它不会被移动到任何地方,即使执行了垃圾收集线程。
C# 编译器只允许在 fixed 语句中分配指向托管变量的指针。
让我们来看看下面的代码:
class Program
{
static void UseFixed()
{
// Normal pointer to an object.
int[] a = new int[5] { 10, 20, 30, 40, 50 };
// 声明为不安全代码
unsafe
{
//int* p = &a[0] 如果不使用fixed,编译器将报错,
//so C# 编译器只允许在 fixed 语句中分配指向托管变量的指针。
fixed (int* p = &a[0])//使用fixed关键字修饰p指向数组a的首地址
{
//使用p2指向p
int* p2 = p;
Console.WriteLine(*p2);
// 移动指针,修改P2的值
p2 += 1;
Console.WriteLine(*p2);
p2 += 1;
Console.WriteLine(*p2);
Console.WriteLine("--------");
Console.WriteLine(*p);
*p += 1;
Console.WriteLine(*p);
*p += 1;
Console.WriteLine(*p);
}
}
Console.WriteLine("--------");
Console.WriteLine(a[0]);
}
static void Main(string[] args)
{
UseFixed();
}
}
在这里,指针p和p2被分配相同的位置。Fixed通常会花销一些资源。实际上它妨碍垃圾收集的正常进程。因此,实际中应该避免使用 fixed语句。