В чем разница между делегатом и действием в C #

Если я буду искать, я обязательно получу примеры, показывающие, что такое делегат и действие. Я прочитал основные книги, приводящие примеры делегатов.

Но что я хочу знать, так это их использование в реальном мире. Пожалуйста, не приводите пример Hello World или класс Animal, они слишком простые

Например, :

What are the difference between them When to use a delegate or action When not to use a delegate or action When they can be an over kill
 HatSoft07 июл. 2012 г., 18:23
Я могу искать и читать MSDN на этих буксирах. Но то, что я ищу, это простые примеры из реальной жизни для делегата & amp; действие
 CodesInChaos07 июл. 2012 г., 18:29
Вы не можете использоватьAction без использования делегата в то же время, так какAction это определенный тип делегата.
 gotopie07 июл. 2012 г., 18:19
Действие - это делегат, чья подпись не имеет параметров и не имеет возвращаемого значения.

Ответы на вопрос(5)

который неоднократно запрашивался, уже был предоставлен в более раннем ответе & quot; Console.WriteLine & quot; пользователь.

Что касается того, почему это было предоставлено, из того, что я понял, Action - это способ сэкономить, продолжая определять новых собственных делегатов. Поскольку это предопределенный делегат определенных типов подписи, вы избавляете себя от необходимости создавать разные делегаты для каждой предполагаемой цели. Вы просто используете предопределенный делегат Action, чтобы указать на ваши методы и запустить их. То же самое и в случае с делегатами Func.

На самом деле это скорее удобство, нежели новая функциональность. Помогает сделать ваш код коротким и понятным, с меньшими хлопотами.

Насколько ваши точечные вопросы,

What are the difference between them

Нет разницы. Действие - это предопределенный делегат, предназначенный для того, чтобы избавить вас от необходимости повторного определения новых делегатов.

When to use a delegate or action

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

class Program
{
    static void Main()
    {
     Dictionary<string, Action> dict = new Dictionary<string, Action>();
     dict["loadFile"] = new Action(LoadFile);
     dict[,"saveFile"] = new Action(SaveFile);

     dict["loadFile"].Invoke();
     dict["saveFile"].Invoke();
    }

    static void SaveFile()
    {
     Console.WriteLine("File saved!");
    }

    static void LoadFile()
    {
     Console.WriteLine("Loading File...");
    }
}

Другое типичное использование для методов обратного вызова. Примером может служить то, что вы используете класс BubbleSort, передавая метод компаратора в качестве делегата классу, который будет использоваться классом BubbleSort, чтобы позволить вашему коду определять логику сравнения, заботясь обо всем остальном. Это также может быть использовано в потоках, которые вы начали, и поток вызывает делегата, когда некоторые промежуточные действия должны быть сообщены вашему коду.

Вы можете сослаться на этот пост, чтобы увидеть отличный пример выше. https://stackoverflow.com/a/3794229/1336068

When not to use a delegate or action

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

When they can be an over kill

Когда вы используете их безвозмездно без реальной необходимости. В противном случае в большинстве ситуаций они могут стать элегантным способом решения вышеуказанных сценариев.

Кроме того, прочитайте этот SO-ответ, чтобы увидеть различия между обычными методами и делегатами, чтобы лучше понять, где использовать делегаты / action / func https://stackoverflow.com/a/17380580/1336068

 02 окт. 2017 г., 19:46
хорошая попытка немного затянуто
Решение Вопроса

Action is Delegate, Это определяется так:

Вы можете создавать свои собственные типы делегатов аналогично тому, как вы создаете абстрактные методы; вы пишете подпись, но не реализуете. Затем вы создаете экземпляры этих делегатов, используя ссылку на метод.

class Program
{
    public static void FooMethod()
    {
        Console.WriteLine("Called foo");
    }

    static void Main()
    {
        Action foo = FooMethod; // foo now references FooMethod()
        foo(); // outputs "Called foo"
    }
}

вы по сути определяете сигнатуру метода (возвращаемый тип и аргументы).

Действие - это делегат, который уже был определен (возврат void и отсутствие аргументов).

public delegate void Action()

Вы можете перейти к определению и увидеть это самостоятельно. Или здесь, в документах.http://msdn.microsoft.com/en-us/library/system.action.aspx

Я почти всегда использую существующие универсальные делегаты (из которых одно действие), когда сигнатура метода, который я ищу, совпадает с поддерживаемыми сигнатурами. Хорошая особенность использования обобщенных делегатов в том, что они хорошо известны. Большинство разработчиков знают, что действие является недействительным. Если бы я должен был определить свою собственную версию Action, каждый должен был бы посмотреть ее подпись, и я просто продублировал кое-что, что уже существует.

Для примера ... Действие случается немного реже, поскольку целью метода void / void может быть только мутация. Func очень распространен (также общий делегат). Есть примеры его использования во всем фреймворке, особенно в linq. Посмотрите на. Где, например.http://msdn.microsoft.com/en-us/library/bb534803.aspx , Это Func, означающий, что он принимает элемент типа коллекции, с которой вы работаете, в качестве параметра и возвращает bool. В контексте оператора where, имеющего Func, возвращать true означает включать его в результаты, наоборот, для false.

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate
)
 HatSoft07 июл. 2012 г., 18:23
Как я уже сказал, я могу искать и читать MSDN, но нужен реальный пример

What is Action:

Why we need Action: Действие инкапсулирует разное количество параметров и различный тип возвращаемого типа, который во многих случаях достаточен для разработки приложений. Они предоставляются в пространстве имен системы. Вы можете создать свой собственный делегат.

Обратите внимание, что существует 17 различных типов Action и Func, каждый из которых имеет от 0 до 16 параметризованных общих аргументов.

Action always has no return value. Func has a single parameterized generic return type.

IMHO, Делегат предиката не нужно было определять как его действительно эквивалентный Func, который принимает аргумент arg и возвращает bool.

Осада уже указала код & amp; MSDN Я просто попытаюсь привести пример из реального мира.

Рассмотрим делегата, который определяет «перемещение».

«Действие» делегатом в реальном мире будет «Запускать»; или "Прогулка". Вы не заботитесь о том, с какой скоростью вы двигаетесь, каким маршрутом вы выбираете, или сообщаете, сколько времени прошло.

Например, делегат без действия может определить, с какой скоростью вы бежите, и вернуть время, необходимое для его выполнения.

public delegate void MoveAction();
public delegate int MoveDelegate(int speed);

Расширение примеров осады.

class Program
{
    public static void Run()
    {
        Console.WriteLine("Running");
    }

    public static int RunAtSpeed(int speed)
    {
         // logic to run @ speed and return time
         Console.WriteLine("Running @ {0}", speed); 
         return 10;
    }

    public static int WalkAtSpeed(int speed)
    {
         // logic to walk @ speed and return time
         Console.WriteLine("Walking @ {0}", speed); 
         return 20;
    }

    static void Main()
    {
        Action foo = Run; 
        foo(); 

        MoveDelegate run = RunAtSpeed;
        int result1 = run(5);

        MoveDelegate walk = WalkAtSpeed;
        int result2 = walk(1);
    }
}

Ваш ответ на вопрос