安全代码和不安全的代码(C# 与 Java)
更新:2007 年 11 月
C# 的一项特别有趣的功能是支持不安全类型的代码。通常,公共语言运行时 (CLR) 负责检查 Microsoft 中间语言 (MSIL) 代码的行为,防止任何有问题的操作。但是,有时您希望直接访问低级功能(如 Win32 API 调用),只要您负责确保此类代码能够正确运行,就允许您这样做。此类代码必须放在源代码中的不安全块内。
Unsafe 关键字
进行低级 API 调用、使用指针算法或执行其他一些棘手操作的 C# 代码必须放在以 unsafe 关键字标记的块内。下面的任何代码均可标记为 unsafe:
整个方法。
大括号中的代码块。
单个语句。
下面的示例演示如何在上述三种情况下使用 unsafe:
class TestUnsafe
{
unsafe static void PointyMethod()
{
int i=10;
int *p = &i;
System.Console.WriteLine("*p = " + *p);
System.Console.WriteLine("Address of p = {0:X2}\n", (int)p);
}
static void StillPointy()
{
int i=10;
unsafe
{
int *p = &i;
System.Console.WriteLine("*p = " + *p);
System.Console.WriteLine("Address of p = {0:X2}\n", (int)p);
}
}
static void Main()
{
PointyMethod();
StillPointy();
}
}
在这段代码中,整个 PointyMethod() 方法被标记为 unsafe,因为该方法声明和使用了指针。StillPointy() 方法将一个代码块标记为 unsafe,因为这个代码块再次使用了指针。
fixed 关键字
在安全代码中,垃圾回收器在对象的生存期内可以自由地移动对象,以组织和压缩可用资源。但是,如果代码使用了指针,则此行为可能很容易造成意外的结果,因此您可以使用 fixed 语句来指示垃圾回收器不要移动某些对象。
下面的代码演示了使用 fixed 关键字以确保在执行 PointyMethod() 方法中的代码块时系统不会移动数组。注意:fixed 只用于不安全的代码中:
class TestFixed
{
public static void PointyMethod(char[] array)
{
unsafe
{
fixed (char *p = array)
{
for (int i=0; i<array.Length; i++)
{
System.Console.Write(*(p+i));
}
}
}
}
static void Main()
{
char[] array = { 'H', 'e', 'l', 'l', 'o' };
PointyMethod(array);
}
}