Action<T> 委托使用详解

Action<T> 委托其实与[button url="http://redcat7.net/?p=343" style="dark"]Func<T, TResult> 委托[/button]一样,都是为了简化委托的使用,这两者的不同之处在于Action<T> 封装一个方法且该方法只有一个参数并且不返回值,而Func<T, TResult>封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。

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

那么Action<T>是如何简化委托调用的呢?

请先看委托传统的使用方法:

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

上面的代码显式声明了一个名为 DisplayMessage 的委托,并将对 WriteLine 方法或 ShowWindowsMessage 方法的引用分配给其委托实例。

以下示例简化了此代码,它所用的方法是实例化 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> ,我们完美避开了对委托的定义,但缺点是它只接受一个参数,好在这个参数可以是任意类型,如果我们有多个参数需要传递,而又不想定义委托,那么我们可以新建一个对象类来封装我们的参数,以满足Action<T>对参数的要求。

Action<T>除了以上用法之外,还可以通过下面两种方法来达到相同的目的,但是没有上面的方法简单。

1. 我们也可以按照以下示例所演示的那样在 C# 中将 Action<T> 委托与匿名方法一起使用。

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

2. 我们还可以按照以下示例所演示的那样将 lambda 表达式分配给 Action<T> 委托实例。

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

完。

时间: 2024-10-11 20:08:09

Action<T> 委托使用详解的相关文章

C#中常见的系统内置委托用法详解(抄录)

C#中常见的系统内置委托 Action类.Func类.Predicate<T>.Comparison<T>委托 Action类的委托 Action委托 封装一个方法,该方法不具有参数并且不返回值 Action<T>委托 封装一个方法,该方法只有一个参数并且不返回值 Action<T1,T2>委托 封装一个方法,该方法具有两个参数并且不返回值 static void Main(string[] args) { #region Action<T>委托

委托基础详解

/*委托是一个类型安全的对象        * 它指向程序中另一个以后被调用的方法或多个方法.委托类型包含3个重要的信息:        * 1:它所调用的方法的名称        * 2:该方法的参数(可选)        * 3:该方法的返回值(可选)        * 注:.net委托既可以指向静态方法,也可以指向实例方法        *         * 当一个委托对象被创建并提供了上述信息后,它可以在运行时动态调用其他指向的方法,可以看到 .Net Framework 中每个委托(

javascript事件委托机制详解

以个人前端工作面试经历来看,javascript事件委托是问的最多的一类题目之一,熟悉事件委托能够了解你对于javascript的掌握程度. 面试官可能问一下问题,现在有5个li待办事件,需要实现当点击一个li时实现弹出该li的信息 <ul class="top"> <li>橘子</li> <li>香蕉</li> <li>苹果</li> <li>梨子</li> <li>

[转]委托的详解

C# 中的委托和事件 委托和事件在 .NET Framework 中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里堵得慌,浑身不自在.本章中,我将由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..NET Framework 中的委托和事件.委托中方法异常和超时的处理.委托与异步编程.委托和事件对Observer 设计模式的意义,对它们的编译代码也做了讨论

C#委托使用详解(Delegates)

摘要 委托是C#编程一个非常重要的概念,也是一个难点.本文将系统详细讲解委托. 1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻.说实话,每个人都委托都有不同的见解,因为看问题的角度不同.个人认为,可以从以下2点来理解:  (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型. (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象. 既然委托是一种类型,那么它存储的是什么数据? 我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址.

【C#】C#委托使用详解(Delegates)

摘要 委托是C#编程一个非常重要的概念,也是一个难点.本文将系统详细讲解委托. 1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻.说实话,每个人都委托都有不同的见解,因为看问题的角度不同.个人认为,可以从以下2点来理解:  (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型. (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象. 既然委托是一种类型,那么它存储的是什么数据? 我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址.

【转-整理】Struts2中package,action,result,method配置详解

1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6

Intent的Component,Action和Category属性详解-android学习之旅(五十)

Component属性 代码示例 public class MainActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btnIntent).setOnClickListener(ne

UITableView SDK委托方法详解

今天跟大家分享一下UITableView的各个代理方法的用法,主要是根据SDK里面的介绍,再加上自己的分析与测试,总结成此文.如果有疑问的话,希望大家留言告诉我~ 本文主要讲解对于UITableView最重要的两个协议 UITableViewDataSource UITableViewDelegate UITableViewDataSource 1)tableView:cellForRowAtIndexPath: 申请一个cell插入到表视图特定的位置,cell生成访问到的方法. 2)numbe