Question

Je travaillais avec les délégués d'action en C # dans l'espoir d'en apprendre davantage sur eux et penser où ils pourraient être utiles.

Quelqu'un at-il utilisé le délégué d'action, et si oui, pourquoi? ou pourriez-vous donner quelques exemples où il pourrait être utile?

Était-ce utile?

La solution

MSDN dit:

  

Ce délégué est utilisé par le   Procédé Array.ForEach et la   List.ForEach procédé pour effectuer une   action sur chaque élément de la matrice ou   liste.

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

Autres conseils

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

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 collecte des noms et exécute la méthode contre chaque membre print de la collection. Ceci est un peu un changement de paradigme pour nous les développeurs C # que nous nous dirigeons vers un style plus fonctionnel de la programmation. (Pour plus d'informations sur la science informatique derrière lire ceci: http: // fr. wikipedia.org/wiki/Map_(higher-order_function) .

Maintenant, si vous utilisez C # 3, vous pouvez lisse ce un peu avec une expression lambda comme ceci:

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

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

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

Et avec la puissance de la puissance des actions que vous pouvez activer ce commutateur dans 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 prendre ce plus loin:

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

....

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

Juste quelques exemples. Bien sûr, l'utilisation plus évidente serait les méthodes d'extension LINQ.

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

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

J'ai utilisé le délégué d'action comme celui-ci 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 est tout ce qu'il fait stocker une action (méthode appel) contre un type de contrôle de sorte que vous pouvez effacer tous les contrôles sur un formulaire à défaut là.

Pour un exemple de la façon dont l'action <> est utilisé.

Console.WriteLine a une signature qui satisifies 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);         
    }

Hope this helps

Je l'utilise quand je suis face à la Croix illégale Sujet Appels 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 le crédit à Reed Copsey utilisateur SO 65358 pour la solution. Ma question complète des réponses est SO Question 2587930

I utilisé comme un rappel dans un gestionnaire d'événement. Quand je lève l'événement, je passe dans une méthode prenant une chaîne un paramètre. C'est ce que la levée de l'événement ressemble à:

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 de mettre à jour les données. Je l'utiliser pour demander des informations de l'utilisateur.

Nous utilisons beaucoup de fonctionnalités délégué d'action dans les tests. Lorsque nous avons besoin de construire un objet par défaut et plus tard besoin de le modifier. J'ai fait petit exemple. Pour construire objet personne par défaut (John Doe), nous utilisons la fonction BuildPerson(). Plus tard, on ajoute Jane Doe aussi, mais nous modifions la date de naissance et le nom et la hauteur.

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; }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top