Страница 328 из 502
<b>// Продемонстрировать применение указателей и ключевого слова unsafe.</b>
<b>using System;</b>
<b>class UnsafeCode {</b>
<b> // Пометить метод Main() как небезопасный,</b>
<b> unsafe static void Main() {</b>
<b> int count = 99;</b>
<b> int* p; // создать указатель типа int</b>
<b> p = &count; // поместить адрес переменной count в переменной р</b>
<b> Console.WriteLine("Исходное значение переменной count: " + *p);</b>
<b> *p = 10; // присвоить значение 10 переменной count,</b>
<b> // на которую указывает переменная р</b>
<b> Console.WriteLine("Новое значение переменной count: " + *p);</b>
<b> }</b>
<b>}</b>
Эта программа дает следующий результат.
<b>Исходное значение переменной count: 99</b>
<b>Новое значение переменной count: 10</b>
В работе с указателями нередко используется модификатор fixed, который препятствует удалению управляемой переменной средствами "сборки мусора". Потребность в этом возникает, например, в том случае, если указатель обращается к полю в объекте определенного класса. А поскольку указателю ничего не известно о действиях системы "сборки мусора", то он будет указывать не на тот объект, если удалить нужный объект. Ниже приведена общая форма модификатора fixed:
<b>fixed <i>(тип* р = &фиксированный_объект)</i> {</b>
<b>// использовать фиксированный объект</b>
<b>}</b>
где р обозначает указатель, которому присваивается адрес объекта. Этот объект будет оставаться на своем текущем месте в памяти до конца выполнения кодового блока. В качестве адресата оператора fixed может быть также указано единственное выражение, а не целый кодовый блок. Модификатор fixed допускается использовать только в коде, помеченном как небезопасный. Кроме того, несколько указателей с модификатором fixed могут быть объявлены списком через запятую.
Ниже приведен пример применения модификатора fixed.
<b>// Продемонстрировать применение оператора fixed.</b>
<b>using System;</b>
<b>class Test {</b>
<b> public int num;</b>
<b> public Test(int i) {</b>
<b> num = i;</b>
<b> }</b>
<b>}</b>
<b>class FixedCode {</b>
<b> // Пометить метод Main() как небезопасный,</b>
<b> unsafe static void Main() {</b>
<b> Test o = new Test(19);</b>
<b> fixed (int* p = &o.num) {</b>
<b> // использовать модификатор fixed для размещения</b>
<b> // адреса переменной экземпляр о.num в переменной р</b>
<b> Console.WriteLine("Исходное значение переменной о.num: " + *p);</b>
<b> *p = 10; // присвоить значение 10 переменной count,</b>
<b> // на которую указывает переменная р</b>
<b> Console.WriteLine("Новое значение переменной о.num: " + *p);</b>
<b> }</b>
<b> }</b>
<b>}</b>
Вот к какому результату приводит выполнение этой программы.
<b>Исходное значение переменной о.num: 19</b>
<b>Новое значение переменной о.num: 10</b>
В данном примере модификатор fixed препятствует удалению объекта о. А поскольку переменная р указывает на переменную экземпляра о.num, то она будет указывать на недостоверную область памяти, если удалить объект о.
Указатель может указывать на объект типа структуры при условии, что структура не содержит ссылочные типы данных. Для доступа к члену структуры с помощью указателя следует использовать оператор-стрелку (->), а не оператор-точку (.). Например, доступ к членам структуры
<b>struct MyStruct {</b>
<b> public int a;</b>
<b> public int b;</b>
<b> public int Sum() {</b>
<b> return a + b;</b>
<b> }</b>
<b>}</b>
осуществляется следующим образом.
<b>MyStruct о = new MyStruct();</b>