134 Stimmen

Verwendungen von Action delegate in C#

Ich habe mit den Action Delegates in C# gearbeitet, in der Hoffnung, mehr über sie zu erfahren und zu überlegen, wo sie nützlich sein könnten.

Hat jemand den Action Delegate verwendet, und wenn ja, warum? oder könnten Sie einige Beispiele nennen, wo er nützlich sein könnte?

116voto

Andrew Hare Punkte 332190

Hier ein kleines Beispiel, das die Nützlichkeit des Action-Delegaten zeigt

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Action<String> print = new Action<String>(Program.Print);

        List<String> names = new List<String> { "andrew", "nicole" };

        names.ForEach(print);

        Console.Read();
    }

    static void Print(String s)
    {
        Console.WriteLine(s);
    }
}

Beachten Sie, dass die foreach-Methode die Sammlung von Namen durchläuft und die print Methode für jedes Mitglied der Sammlung. Dies ist eine Art Paradigmenwechsel für uns C#-Entwickler, da wir uns in Richtung eines funktionalen Programmierstils bewegen. (Für weitere Informationen über die Informatik dahinter lesen Sie dies: http://en.wikipedia.org/wiki/Map_(Funktion höherer Ordnung) .

Nun, wenn Sie C# 3 verwenden, können Sie dies ein bisschen mit einem Lambda-Ausdruck wie so glätten:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<String> names = new List<String> { "andrew", "nicole" };

        names.ForEach(s => Console.WriteLine(s));

        Console.Read();
    }
}

69voto

Programmin Tool Punkte 6377

Wenn Sie einen Schalter haben, können Sie das tun:

switch(SomeEnum)
{
  case SomeEnum.One:
      DoThings(someUser);
      break;
  case SomeEnum.Two:
      DoSomethingElse(someUser);
      break;
}

Und mit der Macht des Handelns können Sie diesen Schalter in ein Wörterbuch verwandeln:

Dictionary<SomeEnum, Action<User>> methodList = 
    new Dictionary<SomeEnum, Action<User>>()

methodList.Add(SomeEnum.One, DoSomething);
methodList.Add(SomeEnum.Two, DoSomethingElse); 

...

methodList[SomeEnum](someUser);

Oder man kann noch weiter gehen:

SomeOtherMethod(Action<User> someMethodToUse, User someUser)
{
    someMethodToUse(someUser);
}  

....

var neededMethod = methodList[SomeEnum];
SomeOtherMethod(neededMethod, someUser);

Nur ein paar Beispiele. Die offensichtlichste Verwendung sind natürlich Linq-Erweiterungsmethoden.

26voto

arul Punkte 13880

MSDN sagt:

Dieser Delegat wird von der Array.ForEach-Methode und der List.ForEach-Methode verwendet, um eine Aktion für jedes Element des Arrays oder der Liste.

Sie können ihn aber auch als generischen Delegaten verwenden, der 1-3 Parameter annimmt, ohne einen Wert zurückzugeben.

16voto

Aaron Powell Punkte 24630

Sie können Aktionen für kurze Ereignishandler verwenden:

btnSubmit.Click += (sender, e) => MessageBox.Show("You clicked save!");

15voto

Nathan W Punkte 52415

Ich habe den Aktionsdelegierten einmal auf diese Weise in einem Projekt verwendet:

private static Dictionary<Type, Action<Control>> controldefaults = new Dictionary<Type, Action<Control>>() { 
            {typeof(TextBox), c => ((TextBox)c).Clear()},
            {typeof(CheckBox), c => ((CheckBox)c).Checked = false},
            {typeof(ListBox), c => ((ListBox)c).Items.Clear()},
            {typeof(RadioButton), c => ((RadioButton)c).Checked = false},
            {typeof(GroupBox), c => ((GroupBox)c).Controls.ClearControls()},
            {typeof(Panel), c => ((Panel)c).Controls.ClearControls()}
    };

die alles, was es tut, ist eine Aktion (Methodenaufruf) gegen eine Art von Kontrolle zu speichern, so dass Sie alle Steuerelemente auf einem Formular zurück zu dort Standardwerte löschen können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X