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