Utilisation des pouvoirs d'Action délégués en C#

je travaillais avec les délégués de L'Action au C# dans l'espoir d'en apprendre plus sur eux et de réfléchir à l'endroit où ils pourraient être utiles.

Quelqu'un a-t-il utilisé le Délégué à L'Action, et dans l'affirmative, pourquoi? ou Pourriez-vous donner quelques exemples où cela pourrait être utile?

133
demandé sur Mikael Engver 2008-12-16 14:38:42

9 réponses

MSDN dit:

Ce délégué est utilisé par le Tableau.Pour chaque méthode et le Liste.Chaque méthode pour effectuer un action sur chaque élément du tableau ou liste.

sauf que, vous pouvez l'utiliser comme un délégué générique qui prend 1-3 paramètres sans retourner aucune valeur.

25
répondu arul 2008-12-16 11:46:16

voici un petit exemple qui montre l'utilité de l'Action du délégué

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);
    }
}

notez que la méthode foreach itère la collection de noms et exécute la méthode print contre chaque membre de la collection. C'est un peu un changement de paradigme pour nous développeurs C# alors que nous nous dirigeons vers un style de programmation plus fonctionnel. (Pour plus d'information sur l'informatique derrière elle lire ce qui suit: http://en.wikipedia.org/wiki/Map_(plus-order_function) .

maintenant si vous utilisez C# 3 vous pouvez slick ce vers le haut d'un peu avec une expression lambda comme ainsi:

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();
    }
}
113
répondu Andrew Hare 2012-06-08 21:47:08

Eh bien, une chose que vous pourriez faire est si vous avez un commutateur:

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

et avec la puissance des actions, vous pouvez transformer ce commutateur en un dictionnaire:

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

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

...

methodList[SomeEnum](someUser);

ou vous pouvez aller plus loin:

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

....

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

quelques exemples. Bien sûr, L'utilisation la plus évidente serait les méthodes D'extension Linq.

67
répondu Programmin Tool 2011-09-02 17:59:39

vous pouvez utiliser des actions pour les gestionnaires d'événements courts:

btnSubmit.Click += (sender, e) => MessageBox.Show("You clicked save!");
16
répondu Aaron Powell 2008-12-16 12:07:47

j'ai utilisé le délégué d'action comme ceci dans un projet une fois:

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()}
    };

qui tout ce qu'il fait est de stocker une action(appel de méthode) contre un type de contrôle de sorte que vous pouvez effacer tous les contrôles sur un formulaire de retour à là par défaut.

14
répondu Nathan W 2008-12-16 11:53:02

pour un exemple d'utilisation de L'Action<>.

de la Console.WriteLine a une signature qui satigne Action<string> .

    static void Main(string[] args)
    {
        string[] words = "This is as easy as it looks".Split(' ');

        // Passing WriteLine as the action
        Array.ForEach(words, Console.WriteLine);         
    }

Espérons que cette aide

13
répondu Binary Worrier 2008-12-16 12:02:21

Je l'utilise quand je traite des appels de fils croisés illégaux par exemple:

DataRow dr = GetRow();
this.Invoke(new Action(() => {
   txtFname.Text = dr["Fname"].ToString();
   txtLname.Text = dr["Lname"].ToString(); 
   txtMI.Text = dr["MI"].ToString();
   txtSSN.Text = dr["SSN"].ToString();
   txtSSN.ButtonsRight["OpenDialog"].Visible = true;
   txtSSN.ButtonsRight["ListSSN"].Visible = true;
   txtSSN.Focus();
}));

je dois donner crédit à Reed Copsey donc utilisateur 65358 pour la solution. Ma question complète avec des réponses est donc Question 2587930

11
répondu Ron Skufca 2017-05-23 12:02:29

je l'ai utilisé comme un rappel dans un gestionnaire d'événement. Quand je relance l'événement, je passe dans une méthode prenant une chaîne de caractères un paramètre. Voici à quoi ressemble la levée de l'événement:

SpecialRequest(this,
    new BalieEventArgs 
    { 
            Message = "A Message", 
            Action = UpdateMethod, 
            Data = someDataObject 
    });

La Méthode:

   public void UpdateMethod(string SpecialCode){ }

est la déclaration de classe de l'événement Args:

public class MyEventArgs : EventArgs
    {
        public string Message;
        public object Data;
        public Action<String> Action;
    }

de cette façon je peux appeler la méthode passée du gestionnaire d'événements avec un certain paramètre pour mettre à jour les données. Je l'utilise pour la demande de certains information de l'utilisateur.

3
répondu Sorskoot 2008-12-16 11:51:08

nous utilisons beaucoup de fonctionnalité action delegate dans les tests. Quand nous avons besoin de construire un objet par défaut et plus tard besoin de le modifier. J'ai fait un peu l'exemple. Pour construire l'objet personne par défaut (John Doe), nous utilisons la fonction BuildPerson() . Plus tard, nous ajoutons Jane Doe aussi, mais nous modifions sa date de naissance, son nom et sa taille.

public class Program
{
        public static void Main(string[] args)
        {
            var person1 = BuildPerson();

            Console.WriteLine(person1.Firstname);
            Console.WriteLine(person1.Lastname);
            Console.WriteLine(person1.BirthDate);
            Console.WriteLine(person1.Height);

            var person2 = BuildPerson(p =>
            {
                p.Firstname = "Jane";
                p.BirthDate = DateTime.Today;
                p.Height = 1.76;
            });

            Console.WriteLine(person2.Firstname);
            Console.WriteLine(person2.Lastname);
            Console.WriteLine(person2.BirthDate);
            Console.WriteLine(person2.Height);

            Console.Read();
        }

        public static Person BuildPerson(Action<Person> overrideAction = null)
        {
            var person = new Person()
            {
                Firstname = "John",
                Lastname = "Doe",
                BirthDate = new DateTime(2012, 2, 2)
            };

            if (overrideAction != null)
                overrideAction(person);

            return person;
        }
    }

    public class Person
    {
        public string Firstname { get; set; }
        public string Lastname { get; set; }
        public DateTime BirthDate { get; set; }
        public double Height { get; set; }
    }
1
répondu evilone 2014-08-09 14:50:28