Action<T> Delegado
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Encapsula un método que tiene un solo parámetro y no devuelve un valor.
generic <typename T>
public delegate void Action(T obj);
public delegate void Action<in T>(T obj);
public delegate void Action<T>(T obj);
type Action<'T> = delegate of 'T -> unit
Public Delegate Sub Action(Of In T)(obj As T)
Public Delegate Sub Action(Of T)(obj As T)
Parámetros de tipo
- T
Tipo de parámetro del método que este delegado encapsula.
Este parámetro de tipo es contravariante, es decir, puede usar el tipo que haya especificado o cualquier tipo menos derivado. Si desea obtener más información sobre la covarianza y la contravarianza, consulte Covarianza y contravarianza en genéricos.Parámetros
- obj
- T
Parámetro del método que este delegado encapsula.
Ejemplos
En el ejemplo siguiente se muestra el uso del Action<T> delegado para imprimir el contenido de un List<T> objeto . En este ejemplo, el Print
método se usa para mostrar el contenido de la lista en la consola. Además, el ejemplo de C# también muestra el uso de métodos anónimos para mostrar el contenido en la consola. Tenga en cuenta que el ejemplo no declara explícitamente una Action<T> variable. En su lugar, pasa una referencia a un método que toma un único parámetro y que no devuelve un valor al List<T>.ForEach método , cuyo único parámetro es un Action<T> delegado. Del mismo modo, en el ejemplo de C#, no se crea una instancia explícita de un Action<T> delegado porque la firma del método anónimo coincide con la firma del Action<T> delegado esperado por el List<T>.ForEach método .
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
*/
// F# provides a type alias for System.Collections.List<'T> as ResizeArray<'T>.
let names = ResizeArray<string>()
names.Add "Bruce"
names.Add "Alfred"
names.Add "Tim"
names.Add "Richard"
let print s = printfn "%s" s
// Display the contents of the list using the print function.
names.ForEach(Action<string> print)
// The following demonstrates the lambda expression feature of F#
// to display the contents of the list to the console.
names.ForEach(fun s -> printfn "%s" s)
(* This code will produce output similar to the following:
* Bruce
* Alfred
* Tim
* Richard
* Bruce
* Alfred
* Tim
* Richard
*)
Imports System.Collections.Generic
Class Program
Shared Sub Main()
Dim names As New List(Of 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(AddressOf Print)
End Sub
Shared Sub Print(ByVal s As String)
Console.WriteLine(s)
End Sub
End Class
' This code will produce output similar to the following:
' Bruce
' Alfred
' Tim
' Richard
Comentarios
Puede usar el Action<T> delegado para pasar un método como parámetro sin declarar explícitamente un delegado personalizado. El método encapsulado debe corresponder a la firma del método definida por este delegado. Esto significa que el método encapsulado debe tener un parámetro que se le pasa por valor y no debe devolver un valor. (En C#, el método debe devolver void
. En Visual Basic, debe definirse mediante ...Sub``End Sub
construct: También puede ser un método que devuelve un valor que se omite). Normalmente, este método se usa para realizar una operación.
Nota
Para hacer referencia a un método que tiene un parámetro y devuelve un valor, use el delegado genérico Func<T,TResult> en su lugar.
Cuando se usa el Action<T> delegado, no es necesario definir explícitamente un delegado que encapsula un método con un único parámetro. Por ejemplo, el código siguiente declara explícitamente un delegado denominado DisplayMessage
y asigna una referencia al WriteLine método o al ShowWindowsMessage
método a su instancia de delegado.
#using <System.Windows.Forms.dll>
using namespace System;
using namespace System::Windows::Forms;
public delegate void DisplayMessage(String^ message);
public ref class TestCustomDelegate
{
public:
static void ShowWindowsMessage(String^ message)
{
MessageBox::Show(message);
}
};
int main()
{
DisplayMessage^ messageTarget;
if (Environment::GetCommandLineArgs()->Length > 1)
messageTarget = gcnew DisplayMessage(&TestCustomDelegate::ShowWindowsMessage);
else
messageTarget = gcnew DisplayMessage(&Console::WriteLine);
messageTarget(L"Hello World!");
return 0;
}
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);
}
}
open System
open System.Windows.Forms
type DisplayMessage = delegate of message: string -> unit
let showWindowsMessage message =
MessageBox.Show message |> ignore
let messageTarget =
DisplayMessage(
if Environment.GetCommandLineArgs().Length > 1 then
showWindowsMessage
else
printfn "%s"
)
messageTarget.Invoke "Hello, World!"
Delegate Sub DisplayMessage(message As String)
Module TestCustomDelegate
Public Sub Main
Dim messageTarget As DisplayMessage
If Environment.GetCommandLineArgs().Length > 1 Then
messageTarget = AddressOf ShowWindowsMessage
Else
messageTarget = AddressOf Console.WriteLine
End If
messageTarget("Hello, World!")
End Sub
Private Sub ShowWindowsMessage(message As String)
MsgBox(message)
End Sub
End Module
En el ejemplo siguiente se simplifica este código mediante la creación de instancias del Action<T> delegado en lugar de definir explícitamente un nuevo delegado y asignarle un método con nombre.
#using <System.Windows.Forms.dll>
using namespace System;
using namespace System::Windows::Forms;
namespace ActionExample
{
public ref class Message
{
public:
static void ShowWindowsMessage(String^ message)
{
MessageBox::Show(message);
}
};
}
int main()
{
Action<String^>^ messageTarget;
if (Environment::GetCommandLineArgs()->Length > 1)
messageTarget = gcnew Action<String^>(&ActionExample::Message::ShowWindowsMessage);
else
messageTarget = gcnew Action<String^>(&Console::WriteLine);
messageTarget("Hello, World!");
return 0;
}
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);
}
}
open System
open System.Windows.Forms
let showWindowsMessage message =
MessageBox.Show message |> ignore
let messageTarget =
Action<string>(
if Environment.GetCommandLineArgs().Length > 1 then
showWindowsMessage
else
printfn "%s"
)
messageTarget.Invoke "Hello, World!"
Module TestAction1
Public Sub Main
Dim messageTarget As Action(Of String)
If Environment.GetCommandLineArgs().Length > 1 Then
messageTarget = AddressOf ShowWindowsMessage
Else
messageTarget = AddressOf Console.WriteLine
End If
messageTarget("Hello, World!")
End Sub
Private Sub ShowWindowsMessage(message As String)
MsgBox(message)
End Sub
End Module
También puede usar el Action<T> delegado con métodos anónimos en C#, como se muestra en el ejemplo siguiente. (Para obtener una introducción a los métodos anónimos, consulte Métodos anónimos).
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);
}
}
También puede asignar una expresión lambda a una Action<T> instancia de delegado, como se muestra en el ejemplo siguiente. (Para obtener una introducción a las expresiones lambda, consulte Expresiones lambda).
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);
}
}
open System
open System.Windows.Forms
let showWindowsMessage message =
MessageBox.Show message |> ignore
let messageTarget =
Action<string>(
if Environment.GetCommandLineArgs().Length > 1 then
fun s -> showWindowsMessage s
else
fun s -> printfn "%s" s
)
messageTarget.Invoke "Hello, World!"
Imports System.Windows.Forms
Public Module TestLambdaExpression
Public Sub Main()
Dim messageTarget As Action(Of String)
If Environment.GetCommandLineArgs().Length > 1 Then
messageTarget = Sub(s) ShowWindowsMessage(s)
Else
messageTarget = Sub(s) ShowConsoleMessage(s)
End If
messageTarget("Hello, World!")
End Sub
Private Function ShowWindowsMessage(message As String) As Integer
Return MessageBox.Show(message)
End Function
Private Function ShowConsoleMessage(message As String) As Integer
Console.WriteLine(message)
Return 0
End Function
End Module
Los ForEach métodos y ForEach toman un Action<T> delegado como parámetro. El método encapsulado por el delegado permite realizar una acción en cada elemento de la matriz o lista. En el ejemplo se usa el ForEach método para proporcionar una ilustración.
Métodos de extensión
GetMethodInfo(Delegate) |
Obtiene un objeto que representa el método representado por el delegado especificado. |