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

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


Action Делегат

Определение

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

C#
public delegate void Action();

Комментарии

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

Примечание

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

При использовании делегата Action не нужно явно определять делегат, который инкапсулирует процедуру без параметров. Например, следующий код явно объявляет делегат с именем ShowValue и назначает ссылку Name.DisplayToWindow на метод экземпляра его экземпляру делегата.

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

public delegate void ShowValue();

public class Name
{
   private string instanceName;

   public Name(string name)
   {
      this.instanceName = name;
   }

   public void DisplayToConsole()
   {
      Console.WriteLine(this.instanceName);
   }

   public void DisplayToWindow()
   {
      MessageBox.Show(this.instanceName);
   }
}

public class testTestDelegate
{
   public static void Main()
   {
      Name testName = new Name("Koani");
      ShowValue showMethod = testName.DisplayToWindow;
      showMethod();
   }
}

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

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

public class Name
{
   private string instanceName;

   public Name(string name)
   {
      this.instanceName = name;
   }

   public void DisplayToConsole()
   {
      Console.WriteLine(this.instanceName);
   }

   public void DisplayToWindow()
   {
      MessageBox.Show(this.instanceName);
   }
}

public class testTestDelegate
{
   public static void Main()
   {
      Name testName = new Name("Koani");
      Action showMethod = testName.DisplayToWindow;
      showMethod();
   }
}

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

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

public class Name
{
   private string instanceName;

   public Name(string name)
   {
      this.instanceName = name;
   }

   public void DisplayToConsole()
   {
      Console.WriteLine(this.instanceName);
   }

   public void DisplayToWindow()
   {
      MessageBox.Show(this.instanceName);
   }
}

public class Anonymous
{
   public static void Main()
   {
      Name testName = new Name("Koani");
      Action showMethod = delegate() { testName.DisplayToWindow();} ;
      showMethod();
   }
}

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

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

public class Name
{
   private string instanceName;

   public Name(string name)
   {
      this.instanceName = name;
   }

   public void DisplayToConsole()
   {
      Console.WriteLine(this.instanceName);
   }

   public void DisplayToWindow()
   {
      MessageBox.Show(this.instanceName);
   }
}

public class LambdaExpression
{
   public static void Main()
   {
      Name testName = new Name("Koani");
      Action showMethod = () => testName.DisplayToWindow();
      showMethod();
   }
}

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

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 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

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