2008-11-11 3 views
5

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

+0

Вы можете предоставить фрагмент кода? возможно, мы могли бы преобразовать строку 'addressof' в эквивалент C#. – Hath 2008-11-11 14:28:19

ответ

6

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

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

2

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

0
EventHandler handler1 = this.button1_Click; 
EventHandler handler2 = new EventHandler(this.button1_Click); 
... 
... 
... 
void button1_Click(object sender, EventArgs e){ 
    // .... 
} 

Оба обозначения эквивалентны.

11

Расширение на ответ Харпера Шелби, да, это можно сделать, но это, как правило, запах кода для этого в .NET.

Чтобы получить адрес переменной в C#, вы можете использовать синтаксис указателя стиля (*)/адрес C (&) /. Чтобы сделать это, вам придется скомпилировать приложение с помощью/unsafe-компилятора, поскольку вы выходите из защищенной сети управляемого кода, как только вы начнете напрямую обращаться к адресам памяти.

Пробу из MSDN говорит большая часть истории:

int number; 
int* p = &number; 
Console.WriteLine("Value pointed to by p: {0}", p->ToString()); 

Это присваивает адрес переменной number на указатель на ан-ИНТ p.

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

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

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

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