zoukankan      html  css  js  c++  java
  • 学习C#中的事件和委托

    最近一直在深深的研究这一块儿,不过还是有许多不解,希望高手提供点学习的比较经典的例子。

    我个人只是得到下面的几点比较浅显的东西:

    1、委托为什么能把事件源跟事件处理程序连接起来?这是因为委托提供了对指定了返回类型和参数列表的方法的一般引用。

    2、你定义了一个事件,要想让它发生,你就要有个东西处理它,这个方法就是事件处理程序。

    3、委托,你的定义好的事件已经找到了一个委托,而且这个委托也为你找到了一个处理这个事件的程序方法,所以你不用担心整个事件的处罚过程。

    4、当然你写一个事件的时候,你要明白,你想要这个事件干什么?怎么干?这就是你定义一个事件,然后找到一个事件的处理程序,二者通过委托这个桥梁搭建起来关系。

    5、事件的触发就是把事件委托的一个实例定义为类的成员,让类能够触发事件。

    6、生成事件的类应该是定义什么时候生成事件的代码,还应该定义生成事件的EventArgs对象的代码。

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 namespace EventDelegate
    7 {
    8 class EventClass
    9 {
    10 public delegate void EventDelegate(object _obj,EventArgs _eventArgs);
    11 public event EventDelegate TestEvent;
    12
    13 public void Run()
    14 {
    15 TestEvent(this, new EventArgs());
    16 }
    17 }
    18 class MyEventArgs : EventArgs
    19 {
    20 private string _myEventArgs;
    21 public string myEventArgs
    22 {
    23 get { return this._myEventArgs; }
    24 set { this._myEventArgs = value; }
    25 }
    26 }
    27 class MyEventClass
    28 {
    29 public delegate void MyEventDelegate(object _obj, MyEventArgs _myEventArgs);
    30 public event MyEventDelegate MyTestEvent;
    31
    32 public void Run()
    33 {
    34 MyEventArgs myEventArgs = new MyEventArgs();
    35 myEventArgs.myEventArgs="这是带数据信息的事件响应后输出的结果";
    36
    37 MyTestEvent(this, myEventArgs);
    38 }
    39 }
    40 class ConsoleMain
    41 {
    42 static void Main(string[] args)
    43 {
    44 EventClass ec = new EventClass();
    45 ec.TestEvent+=new EventClass.EventDelegate(ConsoleWrite);
    46 ec.Run();
    47
    48 MyEventClass mec = new MyEventClass();
    49 mec.MyTestEvent += new MyEventClass.MyEventDelegate(MyConsoleWrite);
    50 mec.Run();
    51 }
    52
    53 static void ConsoleWrite(object sender,EventArgs e)
    54 {
    55 Console.WriteLine("不带事件数据信息的事件响应成功了!");
    56 }
    57
    58 static void MyConsoleWrite(object sender, MyEventArgs _myEventArgs)
    59 {
    60 Console.WriteLine(_myEventArgs.myEventArgs);
    61 }
    62 }
    63 }

      

    上面这个代码是我写的最简单的一个触发事件的例子了,代码很简单,不过我个人是通过这个逐渐理解的。

     下面这个例子是个完整的例子,也是我自己写的,比较详细的吧:

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 namespace testdelegate
    7 {
    8 ///<summary>
    9 /// 重新定义事件委托的EventArgs参数信息,该参数包含事件以外的信息
    10 ///</summary>
    11 class GetInfoEventArgs : EventArgs
    12 {
    13 private char _getInfo;
    14
    15 public char GetInfo
    16 {
    17 get { return this._getInfo; }
    18 set { this._getInfo = value; }
    19 }
    20 }
    21 ///<summary>
    22 /// 产生事件的类,该类用来产生一个事件
    23 ///</summary>
    24 class ProduceEvent
    25 {
    26 ///<summary>
    27 /// 声明事件委托
    28 ///</summary>
    29 ///<param name="_obj">第一个参数,事件源</param>
    30 ///<param name="_getInfoEventArgs">第二个参数,事件外的信息</param>
    31 public delegate void GetInfoDelegate(object _obj, GetInfoEventArgs _getInfoEventArgs);
    32
    33 ///<summary>
    34 /// 定义委托事件
    35 ///</summary>
    36 public event GetInfoDelegate GetInfoEvent;
    37
    38 ///<summary>
    39 /// 事件的触发程序
    40 ///</summary>
    41 public void EventRun()
    42 {
    43 Char getChar;
    44 Console.WriteLine("您现在可以输入一个字符(代表事件外的信息):");
    45 getChar=Convert.ToChar(Console.Read());
    46
    47 GetInfoEventArgs getInfoEventArgs = new GetInfoEventArgs();
    48 //获得事件外的信息并赋值给GetInfo
    49 getInfoEventArgs.GetInfo = getChar;
    50
    51 //触发事件
    52 GetInfoEvent(this, getInfoEventArgs);
    53 }
    54 }
    55 ///<summary>
    56 /// 事件的预定处理
    57 ///</summary>
    58 class BookHandleEvent
    59 {
    60 ///<summary>
    61 /// 预订事件
    62 ///</summary>
    63 ///<param name="_produceEvent">生成事件的类的实例</param>
    64 public static void EventBook(ProduceEvent _produceEvent)
    65 {
    66 _produceEvent.GetInfoEvent += new ProduceEvent.GetInfoDelegate(EventHandle);
    67 }
    68 ///<summary>
    69 /// 事件处理程序
    70 ///</summary>
    71 ///<param name="_obj">事件源</param>
    72 ///<param name="_getInfoEventArgs">包含事件另外信息的参数</param>
    73 public static void EventHandle(object _obj,GetInfoEventArgs _getInfoEventArgs)
    74 {
    75 Console.Write("事件处理程序输出事件额外信息:"+_getInfoEventArgs.GetInfo+"\n");
    76 }
    77 }
    78 class TestDelegate
    79 {
    80 static void Main(string[] args)
    81 {
    82 //实例化产生事件的示例
    83 ProduceEvent pe = new ProduceEvent();
    84
    85 //预定处理事件
    86 BookHandleEvent.EventBook(pe);
    87
    88 //触发事件
    89 pe.EventRun();
    90 }
    91 }
    92 }


    当然这么多都是很浅显的东西,此文还会继续补充的,以为自己的更深理解奠下基础。

    还请高手赐教。

    本人目前就职于河南伯驹网络科技有限公司,主要从事APP开发、小程序开发、网站定制开发,微信号:mxiaozhengcn
  • 相关阅读:
    记录:2019-06-15
    安卓APP环境搭建
    delphi 各版本的特性
    php.ini文件下载
    mysql数据库目录my.ini的内容
    Windows2008 R2 X64 PHP环境搭建步骤
    窗口关闭时弹出内存不能为read
    Delphi编译选项
    Android中EditText无法再次获得焦点
    Android设置分隔线
  • 原文地址:https://www.cnblogs.com/zhengluwei/p/2229119.html
Copyright © 2011-2022 走看看