6. 第二章:C#委托和事件

第二章:C#委托和事件

第三节:Action<T>和Func<T,TResult>

这些都是在.net framework 3.5新增的委托类型,在.net framework 2.0里面,我们用的委托是Delegate

过多的理论叙述不是我们的目的,这里我们用示例的方式展示给大家看一看这些新增的委托的用法:(涉及到函数的重载和泛型的知识点,C#基础不在此处赘述。)

1. Action / Action<T> / Action<T,S> / Action<T,S,M> / ....(无参和多个泛型传参均可),[Action无返回值函数!]

 1     public class MyClass2<T>
 2     {
 3         //无传参
 4         private Action _action1;
 5         //一个传参
 6         private Action<T> _action2;
 7
 8         public MyClass2(Action action1, Action<T> action2)
 9         {
10             this._action1 = action1;
11             this._action2 = action2;
12         }
13
14         public Action Action1
15         {
16             get
17             {
18                 return this._action1;
19             }
20         }
21
22         public Action<T> Action2
23         {
24             get
25             {
26                 return this._action2;
27             }
28         }
29     }
 1     public class MyClass2<T, S> : MyClass2<T>
 2     {
 3         //两个传参
 4         private Action<T, S> _action3;
 5
 6         public MyClass2(Action action1, Action<T> action2, Action<T, S> action3)
 7             : base(action1, action2)
 8         {
 9             this._action3 = action3;
10         }
11
12         public Action<T, S> Action3
13         {
14             get
15             {
16                 return this._action3;
17             }
18         }
19     }

调用:

 1         static void Main(string[] args)
 2         {
 3             //两个参数,泛型为string类型
 4             MyClass2<string> myClass2_001 = new MyClass2<string>(MyMethod, MyMethod);//第一个MyMethod是函数1,第二个MyMethod是函数2
 5             myClass2_001.Action1.Invoke();
 6             myClass2_001.Action2.Invoke("Microsoft Visual Studio 2013");
 7             Console.WriteLine();
 8
 9             //两个参数,泛型为int类型
10             MyClass2<int> myClass2_002 = new MyClass2<int>(MyMethod, MyMethod);//第一个MyMethod是函数1,第二个MyMethod是函数3(若没有函数3,则会调用函数4; 若有函数3,则会选择函数3确定的类型而不选择函数4)
11             myClass2_002.Action1.Invoke();
12             myClass2_002.Action2.Invoke(100);
13             Console.WriteLine();
14
15             //两个参数,泛型为实例化才定义类型
16             MyClass2<double> myClass2_003 = new MyClass2<double>(MyMethod, MyMethod);//第一个MyMethod是函数1,第二个MyMethod是函数4
17             myClass2_003.Action1.Invoke();
18             myClass2_003.Action2.Invoke(3.1415926);
19             Console.WriteLine();
20
21             //三个参数,泛型为实例化才定义类型
22             MyClass2<double, string> myClass2_004 = new MyClass2<double, string>(MyMethod, MyMethod, MyMethod);//第一个MyMethod是函数1,第二个MyMethod是函数4,第三个MyMethod是函数5
23             myClass2_004.Action1.Invoke();
24             myClass2_004.Action2.Invoke(3.1415926);
25             myClass2_004.Action3.Invoke(3.1415926, "Microsoft Visual Studio 2013");
26             Console.WriteLine();
27
28             //Lambda语法的匿名函数,注意对比这种写法和前面的写法有何不同!
29             MyClass2<DateTime> myClass2_005 = new MyClass2<DateTime>(() =>
30             {
31                 Console.WriteLine("Written by lambda: Hello, world!");
32             }, (param) =>
33             {
34                 Console.WriteLine(string.Format("Written by lambda: {0}", param));
35             });
36             myClass2_005.Action1.Invoke();
37             myClass2_005.Action2.Invoke(System.DateTime.Now);
38
39             Console.ReadLine();
40         }
41
42         //函数1
43         private static void MyMethod()
44         {
45             Console.WriteLine("Hello, world!");
46         }
47
48         //函数2
49         private static void MyMethod(string param)
50         {
51             Console.WriteLine(param);
52         }
53
54         //函数3
55         private static void MyMethod(int param)
56         {
57             Console.WriteLine(param);
58         }
59
60         //函数4
61         private static void MyMethod<T>(T param)
62         {
63             Console.WriteLine(param);
64         }
65
66         //函数5
67         private static void MyMethod<T, S>(T param1, S param2)
68         {
69             Console.WriteLine(param1);
70             Console.WriteLine(param2);
71         }

运行结果:

Hello, world!

Microsoft Visual Studio 2013

Hello, world!

100

Hello, world!

3.1415926

Hello, world!

3.1415926

3.1415926

Microsoft Visual Studio 2013

Written by lambda: Hello, world!

Written by lambda: 2016/1/3 2:21:51(这里的时间不一定是这个,根据你自己的运行时间为准!)

2. Func<T,TResult> / Func<T,S,TResult> /...(支持多个泛型参数传入,但一定至少要有一个传入参数,而且返回TResult只能有一个!)

示例1里面已经用了函数的重载和泛型的方式去展现,那在此处的示例就不再用这些方式去展示了,原理类似。(如果想要扩展请自己动手,若写不出就说明阁下基本功掌握的还未熟练,多加练习吧~)

 1     public class MyClass3
 2     {
 3         private Func<string, string> _func;
 4
 5         public MyClass3(Func<string, string> func)
 6         {
 7             this._func = func;
 8         }
 9
10         public Func<string, string> Func
11         {
12             get
13             {
14                 return this._func;
15             }
16         }
17     }

调用:

 1         static void Main(string[] args)
 2         {
 3             MyClass3 myClass3_001 = new MyClass3(MyMethod);
 4             Console.WriteLine(myClass3_001.Func.Invoke("Jacky"));
 5             Console.WriteLine(myClass3_001.Func.Invoke("Tom"));
 6
 7             Console.ReadLine();
 8         }
 9
10         private static string MyMethod(string param)
11         {
12             return string.Format("Good morning, {0}!", param);
13         }

运行结果:
Good morning, Jacky!
Good morning, Tom!

时间: 2024-10-13 16:27:44

6. 第二章:C#委托和事件的相关文章

重中之重:委托与事件

相关文章链接 编程之基础:数据类型(一) 编程之基础:数据类型(二) 高屋建瓴:梳理编程约定 动力之源:代码中的泵 难免的尴尬:代码依赖 可复用代码:组件的来龙去脉 物以类聚:对象也有生命 重中之重:委托与事件 5.1 什么是.NET中的委托 5.1.1 委托的结构 5.1.2 委托链表 5.1.3 委托的不可改变特性 5.1.4 委托的作用 5.2 事件与委托的关系 5.3 使用事件编程 5.3.1 注销跟注册事件同样重要 5.3.2 多线程中使用事件 5.3.3 委托链表的分步调用 5.3.

5. 第二章:C#委托和事件

第二章:C#委托和事件 第二节:事件 事件其实没什么不好理解的,声明一个事件不过类似于声明一个委托类型的变量而已. 1 public class MyTestClass 2 { 3 //定义委托 4 public delegate void MyDelegateHandler(string param); 5 6 //构造函数 7 public MyTestClass() 8 { 9 this.MyDelegateHappened += this.MyInsideDelegateMethod;

第12章 委托与事件

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

.NET进阶篇-语言章-2-Delegate委托、Event事件

知识只有经过整理才能形成技能 整个章节分布简介请查看第一篇 内容目录 一.概述 二.解析委托知识点 1.委托本质 2.委托的使用 3.委托意义 逻辑解耦,减少重复代码 代码封装支持扩展 匿名方法和Lambda表达式 异步多线程 多播委托 三.事件 四.总结 一.概述 先说下委托,委托我们也经常用到.详尽了解委托是必要的,不然在异步多线程的编程中会一头雾水.委托本质就是一个类,和我们平常定义的类没多大区别.只是这个类的作用的是描述一些方法,没有数据成员.一个委托定义了一类拥有同样返回类型和参数的方

C#中委托和事件

目 录 1.1 理解委托 2 1.1.1 将方法作为方法的参数 2 1.1.2 将方法绑定到委托 4 1.2 事件的由来 6 1.2.1 更好的封装性 6 1.2.2 限制类型能力 9 1.3 委托的编译代码 10 1.4 .NET 框架中的委托和事件 11 1.4.1 范例说明 11 1.4.2 Observer 设计模式简介 12 1.4.3 实现范例的Observer 设计模式 13 1.4.4 .NET 框架中的委托与事件 14 1.5 委托进阶 16 1.5.1 为什么委托定义的返回值

[转载]C#深入分析委托与事件

原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html 引言 本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Deleg

[转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)

原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委托是一个类型,是一个函数指针类型,这个类型将该委托的实例化对象所能指向的函数的细节封装起来了,即规定了所能指向的函数的签名,也就是限制了所能指向的函数的参数和返回值.当实例化委托的时候,委托对象会指向某一个匹配的函数,实质就是将函数的地址赋值给了该委托的对象,然后就可以通过该委托对象来调用所指向的函

C#综合揭秘——深入分析委托与事件

本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Delegate 使 Observer(观察者)模式的使用变得更加简单.在事件的介绍上,会讲述事件的使用方式,并以ASP.NET的用户控件为例子,介绍一下自定义事件的使用.最后一节,将介绍Predicate<T>.Action<T>.Func<T,TResult>多种泛型委托的使用和Lamb

浅谈委托和事件(一)

浅谈委托和事件(一) 关于委托和事件,可能是.NET或者说是面向对象编程语言中的一个比较重要又比较难以理解的概念.关于这一话题,园子里的人也写了很多文章,最经典的可能就是张子阳的C#中的委托和事件这两篇文章了,之前也看过MSDN 上的WebCast深入 "委托和事件".可能和很多人一样,刚开始读的时候,觉得很清楚,但是过了一段时间好像又忘记了委托和事件的区别,知道很久以前,在一次面试中我被问到委托和事件有什么区别,一下子就说不清了. 所以这里稍微理一下,也算是自己的一个总结.当然,还是