Каква е разликата между делегат в c# и указател на функция в c++?

Възможен дубликат:
има ли указатели на функции в 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# делегатите са multi-cast, което означава, че могат да преминават през множество функции. Например:

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 има unicast и multicast делегати. Делегатите за мултикаст прилагат операторите += и '-=' за добавяне и премахване на методи от списъка за извикване. Всички делегати, които създавате в C#, са мултикаст делегати. - person Mike Christensen; 12.11.2011
comment
@Mike: Точно така, Multicast Delegates е правилната терминология. Можете да говорите за итерация през абонираните функции и извикването им, но това е наистина неясно и няма голямо значение за средния C# разработчик, тъй като начинът, по който се извикват функциите, е детайл от вътрешната реализация (аз съм дори не съм сигурен, че използва обичайния механизъм на итератор, въпреки че това изглежда правдоподобно). - person Robert Harvey; 12.11.2011
comment
Нека публикувам пример, за да стане малко по-ясно... Имах предвид, че ключовата дума delegate в C# е multicast (това може или не може да е така в други .NET езици). Разбира се, можете да внедрите multicast делегати в 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