Расширяя ответ Харпера Шелби, да, это можно сделать, но это, как правило, запах кода для этого в .NET.
Чтобы получить адрес переменной в C #, вы можете использовать синтаксис указателя в стиле C (*) / address (&) / dereference (->). Для этого вам нужно будет скомпилировать приложение с параметром компилятора / unsafe, поскольку вы выходите из сети безопасности управляемого кода, как только начинаете работать с адресами памяти напрямую.
Пример из MSDN рассказывает большую часть истории:
int number;
int* p = &number;
Console.WriteLine("Value pointed to by p: {0}", p->ToString());
Это присваивает адрес переменной number
указателю на int p
.
Есть некоторые уловки к этому:
- Переменная, адрес которой вы выбираете, должна быть инициализирована. Не проблема для типов значений, которые по умолчанию, но это проблема для ссылочных типов.
- В .NET переменные могут перемещаться в памяти без вашего ведома. Если вам нужно иметь дело с адресом переменной, вы действительно хотите использовать
fixed
для закрепления переменной в ОЗУ.
- & может применяться только к переменной, а не к константе или значению. (Другими словами, вы не можете использовать такую конструкцию, как
int* p = &GetSomeInt();
)
- Опять же, ваш код должен быть скомпилирован в небезопасном режиме, который помечает CLR, что вы будете использовать функции вне управляемого кода "сеть безопасности".
В общем, мой совет в этом мире - серьезно подумать , почему вы думаете, что вам нужно сделать это в мире .NET. Одна из задач .NET заключалась в том, чтобы оградить разработчиков от нападок на металл, и эта функция противоречит этой миссии. Он существует для тех (редких) сценариев, где это необходимо; если вы обнаружите, что используете это легкомысленно просто потому, что можете, вы, вероятно, неправильно используете это и вводите запах кода.
Избегайте его, если это возможно, но знайте, как его использовать, если вам абсолютно необходимо.