В чем разница между AddressOf в c # и указателем в c ++ - PullRequest
0 голосов
/ 15 декабря 2009

Я запутался в AddressOf в C # и указатель в C ++? Прав ли я, что Addressof - это управление выполнением, а указатель - неуправляемое выполнение или что-то еще?

Ответы [ 2 ]

2 голосов
/ 15 декабря 2009

AddressOf является оператором VB и не существует в C #. Создает делегата для процедуры. Делегат может быть использован позже для вызова процедуры в коде, который не включает имя процедуры.

Указатель в C / C ++ является представлением адреса в памяти. Вы можете создать указатель на функцию и использовать его для вызова этой функции, поэтому в этом конкретном случае указатели и делегаты ведут себя аналогично. Однако делегаты - это не просто указатели на функции. Самое важное отличие состоит в том, что делегаты могут быть связаны и вызывать более одной процедуры одновременно.

1 голос
/ 15 декабря 2009

Пример из MSDN рассказывает большую часть истории:

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

Это присваивает адрес числовой переменной указателю на int.

Есть несколько уловок к этому: 1. Переменная, адрес которой вы выбираете, должна быть инициализирована. Не проблема для типов значений, которые по умолчанию, но это проблема для ссылочных типов.

  1. В .NET переменные могут перемещаться в памяти без вашего ведома. Если вам нужно иметь дело с адресом переменной, вам действительно нужно использовать fixed для закрепления переменной в RAM.

  2. & может применяться только к переменной, а не к константе или значению. (Другими словами, вы не можете использовать такую ​​конструкцию, как int * p = & GetSomeInt ();)

  3. Опять же, ваш код должен быть скомпилирован в небезопасном режиме, который указывает CLR, что вы будете использовать функции вне управляемого кода «сеть безопасности».

...