C# delegate Action<T> lambda表达式

转载以记录:http://blog.csdn.net/educast/article/details/7219854

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

 1 usingSystem;
 2 usingSystem.Windows.Forms;
 3 delegatevoid DisplayMessage(stringmessage);
 4 publicclass TestCustomDelegate{
 5    public static void Main()
 6    {
 7       DisplayMessage messageTarget;
 8       if(Environment.GetCommandLineArgs().Length > 1)
 9          messageTarget = ShowWindowsMessage;
10       else
11          messageTarget = Console.WriteLine;
12       messageTarget("Hello, World!");
13    }
14
15    private static void ShowWindowsMessage(stringmessage)
16    {
17       MessageBox.Show(message);
18    }
19 }
20  

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

 1 usingSystem;
 2 usingSystem.Windows.Forms;
 3 publicclass TestAction1
 4 {
 5    publicstatic void Main()
 6    {
 7       Action<string> messageTarget;
 8       if(Environment.GetCommandLineArgs().Length > 1)
 9          messageTarget = ShowWindowsMessage;
10       else
11          messageTarget = Console.WriteLine;
12       messageTarget("Hello, World!");
13    }
14
15    privatestatic void ShowWindowsMessage(stringmessage)
16    {
17       MessageBox.Show(message);
18    }
19 }

也可以将 Action<T> 委托与匿名方法一起使用。

 1 usingSystem;
 2 usingSystem.Windows.Forms;
 3
 4 publicclass TestAnonMethod
 5 {
 6    publicstatic void Main()
 7    {
 8       Action<string> messageTarget;
 9       if(Environment.GetCommandLineArgs().Length > 1)
10          messageTarget = delegate(strings) { ShowWindowsMessage(s); };
11       else
12          messageTarget = delegate(strings) { Console.WriteLine(s); };
13       messageTarget("Hello, World!");
14    }
15
16    privatestatic void ShowWindowsMessage(stringmessage)
17    {
18       MessageBox.Show(message);
19    }
20 }

也可以将 lambda 表达式分配给 Action<T> 委托实例。

 1 usingSystem;
 2 usingSystem.Windows.Forms;
 3
 4 public class TestLambdaExpression
 5 {
 6    public static void Main()
 7    {
 8       Action<string> messageTarget;
 9
10       if(Environment.GetCommandLineArgs().Length > 1)
11          messageTarget = s => ShowWindowsMessage(s);
12       else
13          messageTarget = s => Console.WriteLine(s);
14
15       messageTarget("Hello, World!");
16    }
17
18    private static void ShowWindowsMessage(stringmessage)
19    {
20       MessageBox.Show(message);
21    }
22 }

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

 1 usingSystem;
 2 usingSystem.Collections.Generic;
 3
 4 classProgram
 5 {
 6     staticvoid Main()
 7     {
 8         List<String> names = newList<String>();
 9         names.Add("Bruce");
10         names.Add("Alfred");
11         names.Add("Tim");
12         names.Add("Richard");
13
14         // Display the contents of the list using the Print method.
15         names.ForEach(Print);
16
17         // The following demonstrates the anonymous method feature of C#
18         // to display the contents of the list to the console.
19         names.ForEach(delegate(String name)
20         {
21             Console.WriteLine(name);
22         });
23     }
24
25     privatestatic void Print(strings)
26     {
27         Console.WriteLine(s);
28     }
29 }
30 /* This code will produce output similar to the following:
31  * Bruce
32  * Alfred
33  * Tim
34  * Richard
35  * Bruce
36  * Alfred
37  * Tim
38  * Richard
39  */

时间: 2024-10-06 07:51:22

C# delegate Action<T> lambda表达式的相关文章

c# delegate action func predicate event 匿名函数 lambda

1.delegate 是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类. 与其它的类不同,delegate类能够拥有一个签名 (signature),并且它只能持有与它的签名相匹配的方法的引用. 它所实现的功能与C/C++中的函数指针十分相似.它允许你传递一个类A的方法m 给另一个类B的对象,使得类B的对象能够调用这个方法m.但与函数指针相比,delegate有许多函数指针不具备的优点: 首先,函数指针只能指向静态函 数,而delegate既可以引用静态函数,又可以引用非静态成员函

.NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式

开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,.Net基类库针对实际开发中最常用的情形提供了几个预定义好的委托,这些委托可以直接使用,无需再重头定义一个自己的委托类型.预定义委托在.Net基类库中使用的比较广泛,比如在Lambda表达式和并行计算中都大量地使用,需要我们予以关注起来! /* 新语法索引 */ 1.自动属性 Auto-Impleme

委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录下来,以备复习使用. 委托: 日常工作中,常常见到委托用在具体的项目中.而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下: class Program { public delegate int CalculateDelegate(int x, int y)

匿名方法,Lambda表达式,高阶函数

原文:匿名方法,Lambda表达式,高阶函数 匿名方法 c#2.0引入匿名方法,不必创建单独的方法,因此减少了所需的编码系统开销. 常用于将委托和匿名方法关联,例如 1. 使用委托和方法关联: this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);private void btnRefresh_Click(object sender, EventArgs e){    BindData();} 2. 使用委

委托delegate 泛型委托action&lt;&gt; 返回值泛型委托Func&lt;&gt; 匿名方法 lambda表达式 的理解

1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyBookDel myBookDel; //普通方法 public static void MathBook(int a) { Console.WriteLine("我是数学书" + a); } static void Main(string[] args) { myBookDel += Ma

委托、Lambda表达式、事件系列05,Action委托与闭包

来看使用Action委托的一个实例: static void Main(string[] args) { int i = 0; Action a = () => i++; a(); a(); Console.WriteLine(i); } 结果是期望能的2.但令人好奇的是:栈上的变量i是如何传递给Action委托的? 反编译进行查看,首先看Main方法对应的IL代码: 再看c_DisplayClass1的IL代码: 从中可以看出:→在托管堆上创建了一个名为c_DisplayClass1的实例→把

委托、Lambda表达式、事件系列06,使用Action实现观察者模式

在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式. 就举一个足球场上的例子,当裁判吹响终场哨,胜队庆祝,失败队落寞.把裁判看作是被观察者,比赛中的两队看作是观察者. 裁判作为被观察者需要提供一个Action委托供观察者方法注册. public class Referee { public Action DoSth; public void ISayGameOver() { Co

使用Action、Func和Lambda表达式

在.NET在,我们经常使用委托,委托的作用不必多说,在.NET 2.0之前,我们在使用委托之前,得自定义一个委托类型,再使用这个自定义的委托类型定义一个委托字段或变量..NET 2.0给我们带来了Action.Func两个泛型委托,.NET3.0给我们带来了Lambda,这一切使得委托的定义和使用变得简单起来.下面的例子中的委托都使用了Lambda表达式. 一.Action系列的泛型委托 Action系列的委托定义的是没有返回值(返回值为void)的委托.它有多个版本包括没有输入参数,1个输入参

JAVA8 in Action:行为参数化,匿名类及lambda表达式的初步认知实例整理

import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Predicate; /** * Created by Administrator on 2017/8/19 0013. */ public class Test { /*************************************JAVA8 in Action:行为参数化,匿名类及