Использование делегата действия в C#



Я работал с делегатами действий в C# в надежде узнать о них больше и подумать, где они могут быть полезны.



кто-нибудь использовал делегат действия, и если да, то почему? или не могли бы вы привести несколько примеров, где это может быть полезно?

619   9  

9 ответов:

MSDN говорит:

этот делегат используется Матрица.Метод ForEach и the Список.Метод ForEach для выполнения действие на каждый элемент массива или список.

кроме того, вы можете использовать его в качестве универсального делегата, который принимает 1-3 параметра без возврата какого-либо значения.

вот небольшой пример, который показывает полезность делегат 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);
    }
}

обратите внимание, что метод foreach повторяет коллекцию имен и выполняет print метод для каждого члена коллекции. Это немного сдвиг парадигмы для нас, разработчиков C#, поскольку мы движемся к более функциональному стилю программирования. (Для получения дополнительной информации о компьютерных науках за ним прочитайте это: http://en.wikipedia.org/wiki/Map_(higher-order_function).

Теперь, если вы используете C# 3, Вы можете немного сгладить это с помощью лямбда-выражения:

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

Ну одна вещь, которую вы могли бы сделать, это если у вас есть переключатель:

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

и с мощью действий вы можете превратить этот переключатель в словарь:

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

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

...

methodList[SomeEnum](someUser);

или вы могли бы взять это дальше:

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

....

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

всего несколько примеров. Конечно, более очевидным использованием будут методы расширения Linq.

вы можете использовать действия для нескольких обработчиков событий:

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

я использовал делегат действия, как это в проекте Один раз:

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

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

для примера использования действия.

Я использую его, когда я имею дело с незаконными вызовами перекрестных потоков, например:

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

Я должен отдать должное Риду Копси, поэтому пользователь 65358 для решения. Мой полный вопрос с ответами Итак, вопрос 2587930

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

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

Методика:

   public void UpdateMethod(string SpecialCode){ }

объявление класса события Args:

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

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

мы используем много функций делегирования действий в тестах. Когда нам нужно построить какой-то объект по умолчанию, а затем нужно его изменить. Я сделал небольшой пример. Для построения объекта по умолчанию person (John Doe) мы используем

Comments

    Ничего не найдено.