Интерфейс командной строки различает управляемые и неуправляемые указатели. Управляемый указатель набирается, тип указываемого значения известен во время выполнения, и разрешены только безопасные для типов назначения. Неуправляемые указатели можно напрямую использовать только на языке, который их поддерживает, C ++ / CLI - лучший пример.
Эквивалентом неуправляемого указателя на языке C # является IntPtr
. Вы можете свободно конвертировать указатель вперед и назад с помощью приведения. С ним не связан ни один тип указателя, хотя его имя звучит как «указатель на int», это эквивалент void*
в C / C ++. Для использования такого указателя требуется pinvoke, класс Marshal или приведение к типу управляемого указателя.
Код для игры:
using System;
using System.Runtime.InteropServices;
unsafe class Program {
static void Main(string[] args) {
int variable = 42;
int* p = &variable;
Console.WriteLine(*p);
IntPtr raw = (IntPtr)p;
Marshal.WriteInt32(raw, 666);
p = (int*)raw;
Console.WriteLine(*p);
Console.ReadLine();
}
}
Обратите внимание, как здесь подходит ключевое слово unsafe
. Вы можете позвонить Marshal.WriteInt64 (), и вы не получите никаких жалоб. Это повреждает кадр стека.