安全代码和不安全的代码(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);
    }
}

请参见

任务

“不安全代码”示例

概念

C# 编程指南

参考

不安全代码和指针(C# 编程指南)

其他资源

C# 编程语言(针对 Java 开发人员)