Прочитать на английском

Поделиться через


Action<T> Делегат

Определение

Инкапсулирует метод, который принимает один параметр и не возвращает значения.

C#
public delegate void Action<in T>(T obj);
C#
public delegate void Action<T>(T obj);

Параметры типа

T

Тип параметра метода, инкапсулируемого данным делегатом.

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

Параметры

obj
T

Параметр метода, инкапсулируемого данным делегатом.

Примеры

В следующем примере показано использование делегата Action<T> для печати содержимого List<T> объекта . В этом примере Print метод используется для отображения содержимого списка в консоли. Кроме того, в примере C# также показано использование анонимных методов для отображения содержимого в консоли. Обратите внимание, что в примере не объявляется переменная явным Action<T> образом. Вместо этого он передает ссылку на метод, который принимает один параметр и не возвращает значение List<T>.ForEach в метод, единственный параметр которого является делегатом Action<T> . Аналогично, в примере C# экземпляр делегата не создается явным образом, Action<T> так как сигнатура анонимного метода соответствует сигнатуре делегата Action<T> , ожидаемой методом List<T>.ForEach .

C#
List<string> names = new List<string>();
names.Add("Bruce");
names.Add("Alfred");
names.Add("Tim");
names.Add("Richard");

// Display the contents of the list using the Print method.
names.ForEach(Print);

// The following demonstrates the anonymous method feature of C#
// to display the contents of the list to the console.
names.ForEach(delegate(string name)
{
    Console.WriteLine(name);
});

void Print(string s)
{
    Console.WriteLine(s);
}

/* This code will produce output similar to the following:
* Bruce
* Alfred
* Tim
* Richard
* Bruce
* Alfred
* Tim
* Richard
*/

Комментарии

Делегат можно использовать для передачи Action<T> метода в качестве параметра без явного объявления пользовательского делегата. Инкапсулированный метод должен соответствовать сигнатуре метода, определенной этим делегатом. Это означает, что инкапсулированный метод должен иметь один параметр, который передается ему по значению, и он не должен возвращать значение. (В C# метод должен возвращать void. В Visual Basic она должна быть определена конструкцией Sub...End Sub . Это также может быть метод, возвращающий значение, которое игнорируется.) Как правило, такой метод используется для выполнения операции.

Примечание

Чтобы сослаться на метод, имеющий один параметр и возвращающий значение, используйте вместо него универсальный Func<T,TResult> делегат.

При использовании делегата Action<T> не нужно явно определять делегат, который инкапсулирует метод с одним параметром. Например, следующий код явно объявляет делегат с именем DisplayMessage и назначает ссылку WriteLine на метод или метод его экземпляру делегата ShowWindowsMessage .

C#
using System;
using System.Windows.Forms;

delegate void DisplayMessage(string message);

public class TestCustomDelegate
{
   public static void Main()
   {
      DisplayMessage messageTarget;

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);
   }
}

В следующем примере этот код упрощается путем создания экземпляра делегата Action<T> вместо явного определения нового делегата и назначения ему именованного метода.

C#
using System;
using System.Windows.Forms;

public class TestAction1
{
   public static void Main()
   {
      Action<string> messageTarget;

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);
   }
}

Делегат также можно использовать с анонимными методами Action<T> в C#, как показано в следующем примере. (Общие сведения об анонимных методах см. в разделе Анонимные методы.)

C#
using System;
using System.Windows.Forms;

public class TestAnonMethod
{
   public static void Main()
   {
      Action<string> messageTarget;

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = delegate(string s) { ShowWindowsMessage(s); };
      else
         messageTarget = delegate(string s) { Console.WriteLine(s); };

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);
   }
}

Можно также назначить лямбда-выражение экземпляру делегата Action<T> , как показано в следующем примере. (Общие сведения о лямбда-выражениях см. в разделе Лямбда-выражения.)

C#
using System;
using System.Windows.Forms;

public class TestLambdaExpression
{
   public static void Main()
   {
      Action<string> messageTarget;

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = s => ShowWindowsMessage(s);
      else
         messageTarget = s => Console.WriteLine(s);

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);
   }
}

Методы ForEach и ForEach принимают делегат в Action<T> качестве параметра. Метод, инкапсулированный делегатом, позволяет выполнять действие с каждым элементом в массиве или списке. В примере используется ForEach метод для предоставления иллюстрации.

Методы расширения

GetMethodInfo(Delegate)

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

Применяется к

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

См. также раздел