Безопасный и небезопасный код (сравнение языков 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#)