Если небезопасный код может вызвать осложнения, то зачем вообще создавать такой код? Дело в том, что управляемый код не позволяет использовать указатели. Если у вас имеется некоторый опыт программирования на С или C++, то вам должно быть известно, что
В языке C# указатели объявляются и используются таким же образом, как и в С/С++. Если вы знаете, как пользоваться ими в С/С++, то вам нетрудно будет сделать это и в С#. Но не забывайте, что главное назначение C# — создание управляемого кода. А способность этого языка программирования поддерживать неуправляемый код следует использовать для решения лишь особого рода задач. Это, скорее, исключение, чем правило для программирования на С#. По существу, для компилирования неуправляемого кода следует использовать параметр компилятора /unsafe.
Указатели составляют основу небезопасного кода, поэтому мы начнем его рассмотрение именно с них.
Указатель представляет собой переменную, хранящую адрес какого-нибудь другого объекта, например другой переменной. Так, если в переменной х хранится адрес переменной у, то говорят, что переменная х указывает на переменную у. Когда указатель указывает на переменную, то значение этой переменной может быть получено или изменено по указателю. Такие операции с указателями называют
Переменные-указатели должны быть объявлены как таковые. Ниже приведена общая форма объявления переменной-указателя:
тип* имя_переменной;
где
Обратимся к конкретному примеру. Для того чтобы сделать переменную ip указателем на значение типа int
, необходимо объявить ее следующим образом.
int* ip;
А указатель типа float
объявляется так, как показано ниже.
float* fp;
Вообще говоря, если в операторе объявления после имени типа следует знак *, то это означает, что создается переменная типа указателя.
Тип данных, на которые будет указывать сам указатель, зависит от его соотносимого типа. Поэтому в приведенных выше примерах переменная ip может служить для указания на значение типа int
, а переменная fp — для указания на значение типа float
. Следует, однако, иметь в виду, что указателю ничто не мешает указывать на что угодно. Именно поэтому указатели потенциально небезопасны.
Если у вас есть опыт программирования на C/C++, то вы должны ясно понимать главное отличие в объявлении указателей в C# и C/C++. При объявлении указателя в C/C++ знак *
int* р, q;
объявляется указатель р типа int и переменная q типа int. Это равнозначно двум следующим объявлениям.
int* р;
int q;
А в C# знак *
int* р, q;
создаются две переменные-указателя. Это равнозначно двум следующим объявлениям.
int* р;
int* q;
Это главное отличие следует иметь в виду при переносе кода C/C++ на С#.
В указателях применяются два оператора: *
и &
. Оператор &
является унарным и возвращает адрес памяти своего операнда. (Напомним, что для унарного оператора требуется единственный операнд.) Например, в следующем фрагменте кода:
int* ip;
int num = 10;
ip = #