Evaluar y enviar comentarios
Contraer todo/Expandir todo Contraer todo
Esta página es específica de
Microsoft Visual Studio 2008/.NET Framework 3.5

Hay además otras versiones disponibles para:
Biblioteca de clases de .NET Framework
Action<(Of <(T>)>) (Delegado)

Actualización: noviembre 2007

Encapsula un método que toma un solo parámetro y no devuelve un valor.

Espacio de nombres:  System
Ensamblado:  mscorlib (en mscorlib.dll)
Visual Basic (Declaración)
Public Delegate Sub Action(Of T) ( _
    obj As T _
)
Visual Basic (Uso)
Dim instance As New Action(Of T)(AddressOf HandlerMethod)
C#
public delegate void Action<T>(
    T obj
)
Visual C++
generic<typename T>
public delegate void Action(
    T obj
)
J#
J# admite el uso de APIs genéricas pero no admite la declaración de nuevas API.
JScript
JScript no admite el uso de métodos ni tipos genéricos.

Parámetros de tipo

T

Tipo de parámetro del método que este delegado encapsula.

Parámetros

obj
Tipo: T
Parámetro del método que este delegado encapsula.

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 SubEnd Sub.) Normalmente, se usa un método de este tipo para realizar una operación.

018hxwa8.alert_note(es-es,VS.90).gifNota:

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.

Visual Basic
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
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);      
   }
}

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.

Visual Basic
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
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);      
   }
}

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#).)

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#).)

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);      
   }
}
018hxwa8.alert_note(es-es,VS.90).gifNota:

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.

En el ejemplo siguiente, se muestra el uso del delegado Action<(Of <(T>)>) para imprimir el contenido de un objeto List<(Of <(T>)>). En este ejemplo, el método Print se utiliza 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 presentar el contenido en la consola.

Visual Basic
Imports System
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
C#
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 Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile para Smartphone, Windows Mobile para Pocket PC, Xbox 360

.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

.NET Framework

Compatible con: 3.5, 3.0, 2.0

.NET Compact Framework

Compatible con: 3.5, 2.0

XNA Framework

Compatible con: 2.0, 1.0
Contenido de la comunidad   ¿Qué es Community Content?
Agregar contenido nuevo RSS  Anotaciones
Processing
© 2009 Microsoft Corporation. Reservados todos los derechos. Términos de uso | Marcas Registradas | Privacidad
Page view tracker