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;
10         }
11
12         //内部方法
13         private void MyInsideDelegateMethod(string param)
14         {
15             Console.WriteLine("I am running inside the class \"MyClass\" -> void MyInsideDelegateMethod(string param)");
16             Console.WriteLine(param);
17         }
18
19         //执行
20         public void Execute(string param)
21         {
22             this.OnMyDeletateHappened(param);
23         }
24
25         //事件
26         public event MyDelegateHandler MyDelegateHappened;
27         protected virtual void OnMyDeletateHappened(string param)
28         {
29             MyDelegateHandler handler = this.MyDelegateHappened;
30             if (handler != null)
31             {
32                 handler(param);
33             }
34         }
35     }

调用:

 1         static void Main(string[] args)
 2         {
 3             Console.WriteLine("Only the inside method will be executed!");
 4             //实例化
 5             MyTestClass myTestClass = new MyTestClass();
 6             myTestClass.Execute("Hello, world!");
 7             Console.WriteLine();
 8
 9             Console.WriteLine("The outside method will be added to the delegate logic!");
10             //新增外部委托的方法
11             myTestClass.MyDelegateHappened += MyOutsideDelegateMethod;
12             myTestClass.Execute("Hello, world!");
13             Console.WriteLine();
14
15             Console.WriteLine("The outside method will be removed from the delegate logic!");
16             //去除外部委托的方法
17             myTestClass.MyDelegateHappened -= MyOutsideDelegateMethod;
18             myTestClass.Execute("Hello, world!");
19             Console.ReadLine();
20         }
21
22         private static void MyOutsideDelegateMethod(string param)
23         {
24             Console.WriteLine("I am running ouside the class \"Program\" -> void MyOutsideDelegateMethod(string param)");
25             Console.WriteLine(param);
26         }

运行结果:

Only the inside method will be executed!

I am running inside the class "MyClass" -> void MyInsideDelegateMethod(string param)

Hello, world!

The outside method will be added to the delegate logic!

I am running inside the class "MyClass" -> void MyInsideDelegateMethod(string param)

Hello, world!

I am running ouside the class "Program" -> void MyOutsideDelegateMethod(string param)

Hello, world!

The outside method will be removed from the delegate logic!

I am running inside the class "MyClass" -> void MyInsideDelegateMethod(string param)

Hello, world!

相信有部分读者看到这里,会想起C#里面常见的EventHandler

a. 不带参数的

        public event EventHandler MyEventHappened;
        protected virtual void OnMyEventHanppened()
        {
            EventHandler handler = this.MyEventHappened;
            if (handler != null)
            {
                handler(this, EventArgs.Empty);
            }
        }

其实,请看EventHandler实际的本质是什么:(F12 Go To Definition)

 1 #region Assembly mscorlib.dll, v4.0.0.0
 2 // C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll
 3 #endregion
 4
 5 using System.Runtime.InteropServices;
 6
 7 namespace System
 8 {
 9     // Summary:
10     //     Represents the method that will handle an event that has no event data.
11     //
12     // Parameters:
13     //   sender:
14     //     The source of the event.
15     //
16     //   e:
17     //     An System.EventArgs that contains no event data.
18     [Serializable]
19     [ComVisible(true)]
20     public delegate void EventHandler(object sender, EventArgs e);
21 }

b. 带参数的

        public event EventHandler<EventArgs> MyEventHappened;
        protected virtual void OnMyEventHanppened(EventArgs args)
        {
            EventHandler<EventArgs> handler = this.MyEventHappened;
            if (handler != null)
            {
                handler(this, args);
            }
        }
 1 #region Assembly mscorlib.dll, v4.0.0.0
 2 // C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll
 3 #endregion
 4
 5 namespace System
 6 {
 7     // Summary:
 8     //     Represents the method that will handle an event.
 9     //
10     // Parameters:
11     //   sender:
12     //     The source of the event.
13     //
14     //   e:
15     //     An System.EventArgs that contains the event data.
16     //
17     // Type parameters:
18     //   TEventArgs:
19     //     The type of the event data generated by the event.
20     [Serializable]
21     public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
22 }

带参数的EventArgs,可以我们自己定义继承类去传递我们需要的数据:

 1     public class MyEventArgs : EventArgs
 2     {
 3         private string _param;
 4
 5         public MyEventArgs(string param)
 6         {
 7             this._param = param;
 8         }
 9
10         public string Param
11         {
12             get { return this._param; }
13         }
14     }

定义event的时候:

1         public event EventHandler<MyEventArgs> MyEventHappened2;
2         protected virtual void OnMyEventHappened2(MyEventArgs args)
3         {
4             EventHandler<MyEventArgs> handler = this.MyEventHappened2;
5             if (handler != null)
6             {
7                 handler(this, args);
8             }
9         }

上述两个示例说明:EventHandler本质,依然是一个delegate!只不过它是由系统定义好了而已,现在编程者常用这种方式,便于使用。

代码:

 1     public class MyTestClass2 {
 2         public void Execute(string param)
 3         {
 4             this.OnMyEventHappened(new MyEventArgs(param));
 5         }
 6
 7         public event EventHandler<MyEventArgs> MyEventHappened;
 8         protected virtual void OnMyEventHappened(MyEventArgs args)
 9         {
10             EventHandler<MyEventArgs> handler = this.MyEventHappened;
11             if (handler != null)
12             {
13                 handler(this, args);
14             }
15         }
16     }
17
18     public class MyEventArgs : EventArgs
19     {
20         private string _param;
21
22         public MyEventArgs(string param)
23         {
24             this._param = param;
25         }
26
27         public string Param
28         {
29             get { return this._param; }
30         }
31     }

调用:

 1         static void Main(string[] args)
 2         {
 3             MyTestClass2 myTestClass = new MyTestClass2();
 4             myTestClass.MyEventHappened += MyTestClass_MyEventHappened;
 5             myTestClass.Execute("Hi~");
 6
 7             Console.ReadLine();
 8         }
 9
10         private static void MyTestClass_MyEventHappened(object sender, MyEventArgs e)
11         {
12             Console.WriteLine(e.Param);
13         }

运行结果:
Hi~

此程序中:myTestClass.Execute("Hi~");其实也可以由类的内部调用——这样做,就可以做到类的实例内部触发事件,然后做到“通知”外部注册时逻辑被执行的效果!

综上所述,大家是不是对委托和事件有更清晰的认识了呢?

时间: 2024-08-23 20:12:47

5. 第二章: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.

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&l

第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深入 "委托和事件".可能和很多人一样,刚开始读的时候,觉得很清楚,但是过了一段时间好像又忘记了委托和事件的区别,知道很久以前,在一次面试中我被问到委托和事件有什么区别,一下子就说不清了. 所以这里稍微理一下,也算是自己的一个总结.当然,还是