Поиск

Использование указателей в С#

Рассмотрим некоторые правила, которые относятся к использованию указателей и небезопасного кода на С#. Затем мы погрузимся в изучение примеров. Указатели можно получить только на размерные типы, массивы и строки. В случае массивов их первый элемент должен быть размерного типа, так как С# возвращается указатель на первый элемент массива, а не на сам массив. Поэтому, с точки зрения компилятора, при этом все равно возвращается указатель на размерный тип, а не на ссылочный.

Поддержка стандартной семантики указателей C/C++ в С# проиллюстрирована ниже (табл. 17-1).

Табл. 17-1. Операторы для работы с указателями C/C++.

Оператор

Описание

&

Оператор адрес (address-of) возвращает указатель, представляющий

*

Оператор разыменования (dereference) обозначает значение

->

Оператор разыменования и доступа к члену (dereferencing and member access) используется для доступа к члену и разыменования указателя.

Следующий пример покажется знакомым любому разработчику на С или C++. В нем я вызываю метод, принимающий два указателя на переменные типа int и изменяющий их значения перед возвратом управления вызывающей функции. Не сильно впечатляющая, но действительно наглядная иллюстрация применения указателей на С#.

// Компилируйте это приложение с параметром /unsafe using System;
class UnsafelApp {
public static unsafe void GetValues(int* x, int* y)
{
*x = 6;
*y = 42; }
public static unsafe void Main()
{
int a = 1; int b = 2; Console.WriteLine
("Before GetValuesO : a = {0>, b = {1}",
a, b);
GetValues(&a, &b); Console.WriteLine
("After GetValuesO : a = {0}, b = {1}",
a, b); } }

Этот пример необходимо скомпилировать с параметром компилятора /unsafe. Полученное приложение должно выдать:

Before GetValuesO : a = 1, b = 2 After GetValuesO : a = 6, b = 42