В чем разница между делегатом в с # и указателем на функцию в с ++?

Возможный дубликат:
есть ли указатели на функции в C #?

Мне интересно найти разницу между делегатом в C # и указатель на функцию в C ++.


person Riporter    schedule 11.11.2011    source источник
comment
Ну, один из C #, а другой из C / C ++.   -  person Henk Holterman    schedule 11.11.2011
comment
Поправьте меня, если я ошибаюсь, но разве у C ++ (или хотя бы stl) тоже нет делегатов?   -  person Jordan    schedule 12.11.2011


Ответы (2)


Делегат в C # - это типобезопасный указатель на функцию со встроенным итератором.

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

В C # делегаты являются многоабонентскими, что означает, что они могут выполнять итерацию по нескольким функциям. Например:

class Program
{
   delegate void Foo();

   static void Main(string[] args)
   {
      Foo myDelegate = One;
      myDelegate += Two;

      myDelegate(); // Will call One then Two
   }

   static void One()
   {
      Console.WriteLine("In one..");
   }

   static void Two()
   {
      Console.WriteLine("In two..");
   }
}
person Mike Christensen    schedule 11.11.2011
comment
Хммм ... Я бы сказал и да, и нет. Вы можете указать тип возвращаемого значения и параметры для указателя на функцию, который выполняет многие из упомянутых вами вещей. Единственное исключение, которое я могу придумать, - это привести его к void *. - person riwalk; 11.11.2011
comment
Да, я думаю, это скорее разница между языком и временем выполнения. Все управляемые указатели безопасны, среда выполнения защищает то, на что они указывают, и вы не можете просто увеличить их или повторно интерпретировать, как хотите. Конечно, в C # есть небезопасный код, но это уже другая тема) - person Mike Christensen; 11.11.2011
comment
Немного изменил свой ответ, чтобы было понятнее .. - person Mike Christensen; 11.11.2011
comment
supports the concept of iterating through multiple bound functions. - Что это значит? Вы не можете этого сделать с C ++? - person Robert Harvey; 12.11.2011
comment
Не думаю, что вы правы насчет итератора. Верно, что делегат является типобезопасной функцией, но он не содержит итератора из коробки; хотя вы можете использовать его с итератором. Не могли бы вы более подробно объяснить, что вы имеете в виду? en.wikipedia.org/wiki/Iterator#C.23_and_other_.NET_languages - person Robert Harvey; 12.11.2011
comment
.NET имеет делегатов одноадресной и многоадресной рассылки. Делегаты многоадресной рассылки реализуют операторы += и '- = `для добавления и удаления методов из списка вызовов. Все делегаты, создаваемые на C #, являются делегатами многоадресной рассылки. - person Mike Christensen; 12.11.2011
comment
@Mike: Верно, многоадресные делегаты - это правильная терминология. Вы можете говорить об итерации подписанных функций и их вызове, но это действительно неясно и не имеет большого отношения к среднему разработчику C #, поскольку способ вызова функций является внутренней деталью реализации (я даже не уверен, что он использует обычный механизм итератора, хотя это кажется правдоподобным). - person Robert Harvey; 12.11.2011
comment
Позвольте мне опубликовать пример, чтобы сделать его более понятным ... Я имел в виду, что ключевое слово delegate в C # является многоадресным (это может быть, а может и не быть в других языках .NET). Конечно, вы можете реализовать многоадресные делегаты на C ++ - вы можете реализовать все, что захотите :) - person Mike Christensen; 12.11.2011
comment
Поведение / использование, если делегат / функции возвращают значения: stackoverflow.com/q/12530767/1995714 - person cp.engr; 14.09.2016

Делегаты в C # могут быть синхронными или асинхронными; Указатели функций C ++ являются синхронными, если вы не написали свою собственную многопоточность.

Указатель в C / C ++ не обязательно должен ссылаться на полноценный объект. В C были указатели на функции и не было поддержки объектно-ориентированного языка. Делегаты - это настоящие функциональные объекты.

person duffymo    schedule 11.11.2011