Action 委托

.NET Framework 4

封装一个方法,该方法只有一个参数并且不返回值。

命名空间:  System
程序集:  mscorlib(在 mscorlib.dll 中)

语法

C#

public delegate void Action<in T>(

         T obj

)

VB

'声明

Public Delegate Sub Action(Of In T) ( _

         obj As T _

)

类型参数

in T

此委托封装的方法的参数类型。

该类型参数是逆变的。即可以使用指定的类型或派生程度更低的类型。有关协变和逆变的更多信息,请参见泛型中的协变和逆变

参数

obj

类型:T
此委托封装的方法的参数。

备注

可以使用 Action<T> 委托以参数形式传递方法,而不用显式声明自定义的委托。 封装的方法必须与此委托定义的方法签名相对应。 也就是说,封装的方法必须具有一个通过值传递给它的参数,并且不能返回值。 (在 C# 中,该方法必须返回 void Visual Basic 中,必须通过 Sub…End Sub 结构来定义它。 此属性也可以是返回一个将被忽略的值的方法。)通常,这种方法用于执行某个操作。

说明

若要引用具有一个参数并返回值的方法,请改用泛型 Func<T, TResult> 委托。

在使用 Action<T> 委托时,不必显式定义一个封装只有一个参数的方法的委托。 例如,以下代码显式声明了一个名为 DisplayMessage 的委托,并将对 WriteLine 方法或 ShowWindowsMessage 方法的引用分配给其委托实例。

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

   }

}

VB

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

以下示例简化了此代码,它所用的方法是实例化 Action<T> 委托,而不是显式定义一个新委托并将命名方法分配给该委托。

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

   }

}

VB

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

   }

}

您也可以按照以下示例所演示的那样将 lambda 表达式分配给 Action<T> 委托实例 (有关 lambda 表达式的简介,请参见 Lambda 表达式(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);     

   }

}

VB

Imports System.Windows.Forms

 

Public Module TestLambdaExpression

   Public Sub Main()

      Dim messageTarget As Action(Of String)

 

      If Environment.GetCommandLineArgs().Length > 1 Then

         messageTarget = Function(s) ShowWindowsMessage(s)

      Else

         messageTarget = Function(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

 

 

说明

Visual Basic 要求 lambda 表达式返回值。 因此,如果 lambda 表达式与 Action<T> 委托一起使用,则必须丢弃该返回值。

ForEach ForEach<T> 方法都采用 Action<T> 委托作为参数。 通过使用由委托封装的方法,可以对数组或列表中的每个元素执行操��� 此示例使用 ForEach 方法提供说明。

示例

下面的示例演示如何使用 Action<T> 委托来打印 List<T> 对象的内容。 在此示例中,使用 Print 方法将列表的内容显示到控制台上。 此外,C# 示例还演示如何使用匿名方法将内容显示到控制台上。 请注意该示例不显式声明 Action<T> 变量。 相反,它传递方法的引用,该方法采用单个参数而且不将值返回至 List<T>.ForEach 方法,其单个参数是一个 Action<T> 委托。 同样,在 C# 示例 中,Action<T> 委托不被显式地实例化,因为匿名方法的签名匹配 List<T>.ForEach 方法所期望的 Action<T> 委托的签名。

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

 */

VB

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

 

来自:http://msdn.microsoft.com/zh-cn/library/018hxwa8.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值