AddressOf альтернативы в C # - PullRequest
6 голосов
/ 11 ноября 2008

Может ли кто-нибудь помочь мне с альтернативным решением в C # относительно оператора AddressOf в VB6 ? AddressOf возвращает длинное значение. Каким образом я могу получить вывод в C #?

Ответы [ 4 ]

11 голосов
/ 11 ноября 2008

Расширяя ответ Харпера Шелби, да, это можно сделать, но это, как правило, запах кода для этого в .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.

Есть некоторые уловки к этому:

  1. Переменная, адрес которой вы выбираете, должна быть инициализирована. Не проблема для типов значений, которые по умолчанию, но это проблема для ссылочных типов.
  2. В .NET переменные могут перемещаться в памяти без вашего ведома. Если вам нужно иметь дело с адресом переменной, вы действительно хотите использовать fixed для закрепления переменной в ОЗУ.
  3. & может применяться только к переменной, а не к константе или значению. (Другими словами, вы не можете использовать такую ​​конструкцию, как int* p = &GetSomeInt();)
  4. Опять же, ваш код должен быть скомпилирован в небезопасном режиме, который помечает CLR, что вы будете использовать функции вне управляемого кода "сеть безопасности".

В общем, мой совет в этом мире - серьезно подумать , почему вы думаете, что вам нужно сделать это в мире .NET. Одна из задач .NET заключалась в том, чтобы оградить разработчиков от нападок на металл, и эта функция противоречит этой миссии. Он существует для тех (редких) сценариев, где это необходимо; если вы обнаружите, что используете это легкомысленно просто потому, что можете, вы, вероятно, неправильно используете это и вводите запах кода.

Избегайте его, если это возможно, но знайте, как его использовать, если вам абсолютно необходимо.

6 голосов
/ 11 ноября 2008

C # имеет специальный синтаксис для назначения функций делегатам / событиям. Просто используйте <delegate> += <function>;

Если вы на самом деле пытаетесь получить адрес для другого использования, вам не повезло. Одна из особенностей управляемого кода состоит в том, что эти адреса не обязательно являются фиксированными. Хотя маловероятно, что большинство функций когда-либо изменится, существуют обстоятельства, когда это возможно.

2 голосов
/ 11 ноября 2008

Видимо, это можно сделать (хотя я не уверен, где это понадобится). Вот страница MSDN .

0 голосов
/ 11 ноября 2008
EventHandler handler1 = this.button1_Click;
EventHandler handler2 = new EventHandler( this.button1_Click );
...
...
...
void button1_Click( object sender, EventArgs e ){
    // ....
}

Обе записи эквивалентны.

...