Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Перевод
Английский

Делегат Action<T>

 

Опубликовано: Октябрь 2016

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

Для просмотра исходного кода .NET Framework для этого типа, в разделе Reference Source.

Пространство имен:   System
Сборка:  mscorlib (в mscorlib.dll)

public delegate void Action<in T>(
	T obj
)

Параметры

obj
Type: T

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

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

inT

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

System_CAPS_noteПримечание

Исходный код .NET Framework для этого типа см. в разделе Reference Source. Выполнять поиск исходного кода в Интернете, справочник для автономной работы и пошагово источники (включая исправления и обновления) во время отладки; see instructions.

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

System_CAPS_noteПримечание

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

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

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> делегат вместо явного объявления нового делегата и присвоения именованного метода.

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

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

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        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);
        });
    }

    private static void Print(string s)
    {
        Console.WriteLine(s);
    }
}
/* This code will produce output similar to the following:
 * Bruce
 * Alfred
 * Tim
 * Richard
 * Bruce
 * Alfred
 * Tim
 * Richard
 */

Универсальная платформа Windows
Доступно с 8
.NET Framework
Доступно с 2.0
Переносимая библиотека классов
Поддерживается в: переносимые платформы .NET
Silverlight
Доступно с 2.0
Windows Phone Silverlight
Доступно с 7.0
Windows Phone
Доступно с 8.1
Вернуться в начало
Показ: