Безопасный и небезопасный код (сравнение языков C# и Java)

Обновлен: Ноябрь 2007

Одна из самых интересных функций языка C# заключается в поддержке кода, не являющегося строго типизированным. Обычно среда CLR отслеживает выполнение кода MSIL и предотвращает все сомнительные операции. Однако в некоторых случаях может потребоваться прямой доступ к низкоуровневым функциям, например вызовам Win32 API, и программист может сделать это, взяв на себя ответственность за обеспечение правильной работы этого кода. Такой код необходимо помещать внутрь небезопасных блоков в исходном коде.

Ключевое слово unsafe

Код C#, в котором выполняются низкоуровневые вызовы API, используются вычисления с указателями или выполняется другая сомнительная операция, необходимо поместить в блоки, помеченные ключевым словом 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() помечается как небезопасный, так как он объявляет и использует указатели. Метод StillPointy() помечает блок кода как небезопасный, так как в этом блоке также используются указатели.

Ключевое слово 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