Puede usar el delegado para pasar un método como parámetro sin declarar explícitamente un delegado personalizado. El método debe corresponder a la firma del método definida por el delegado. Esto significa que el método encapsulado debe tener un parámetro, el cual se le pasa por valor, y no debe devolver un valor. (En C#, el método debe devolver void. En Visual Basic, lo debe definir la construcción Sub…End Sub.) Normalmente, se usa un método de este tipo para realizar una operación.
Nota: |
|---|
Para hacer referencia a un método que tiene un parámetro y devuelve un valor, use en su lugar el delegado genérico Func<(Of <(T, TResult>)>). |
Al usar el delegado Action<(Of <(T>)>), no es necesario definir explícitamente un delegado que encapsule un método con un solo parámetro. Por ejemplo, el código siguiente declara explícitamente un delegado denominado DisplayMessage y asigna una referencia al método WriteLine o ShowWindowsMessage a su instancia de delegado.
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
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);
}
}
En el ejemplo siguiente se simplifica este código creando instancias del delegado Action<(Of <(T>)>), en lugar de definir explícitamente un nuevo delegado y asignarle un método con nombre.
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
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);
}
}
También puede usar el delegado Action<(Of <(T>)>) 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, vea Métodos anónimos (Guía de programación de 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);
}
}
También puede asignar una expresión lambda a una instancia de delegado Action<(Of <(T>)>), como se muestra en el ejemplo siguiente. ((Para obtener una introducción a las expresiones lambda, vea Expresiones lambda (Guía de programación de 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);
}
}
Nota: |
|---|
Visual Basic requiere que una expresión lambda devuelva un valor. Como resultado, el delegado Action<(Of <(T>)>) no se puede usar con una expresión lambda en Visual Basic. |
Los métodos ForEach y ForEach<(Of <(T>)>) toman cada uno un delegado Action<(Of <(T>)>) 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 método ForEach para proporcionar una demostración.