AddressOf альтернативы в C#
Может ли кто-нибудь помочь мне с альтернативным решением в C# относительно оператора AddressOf в VB6? AddressOf возвращает длинное значение. Каким образом я могу получить вывод в C#?
4 ответа
Продолжая ответ Харпера Шелби, да, это можно сделать, но, как правило, это запах кода в.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 заключалась в том, чтобы оградить разработчиков от нападок на металл, и эта функция противоречит этой миссии. Он существует для тех (редких) сценариев, где это необходимо; если вы находите себя легкомысленным, используя это просто потому, что можете, вы, вероятно, неправильно используете это и вводите запах кода.
Избегайте его, если это возможно, но знайте, как его использовать, если это абсолютно необходимо.
C# имеет специальный синтаксис для назначения функций делегатам / событиям. Просто используйте <delegate> += <function>;
Если вы на самом деле пытаетесь получить адрес для другого использования, вам не повезло. Одна из особенностей управляемого кода состоит в том, что эти адреса не обязательно являются фиксированными. Хотя маловероятно, что большинство функций когда-либо изменится, существуют обстоятельства, когда это возможно.
Видимо, это можно сделать (хотя я не уверен, где это понадобится). Вот страница MSDN.
EventHandler handler1 = this.button1_Click;
EventHandler handler2 = new EventHandler( this.button1_Click );
...
...
...
void button1_Click( object sender, EventArgs e ){
// ....
}
Оба обозначения эквивалентны.