zoukankan      html  css  js  c++  java
  • 【转】C#笔记之委托(Delegate)(二)

    原文:小贱学C#笔记之委托(Delegate)(二)

    上次聊了下委托(delegate),简单的介绍了下使用方法,顺便问下你家保姆干活还行么?今天我们来看看事件(event)。

    事件实际上是一种特别的委托,通常声明事件的话要声明一个委托,它是这样的:

    [code]csharpcode:

    public delegate void EventHandler(object sender, EventArgs e);
    是不是发现了些什么区别,对,参数!(object sender,EventArgs e)中sender表示是谁触发了这个事件,比如这是个点击事件,那一般就是按钮触发的。下面给出示例代码来理解下:

    [code]csharpcode:

    using System;
    using System.Collections.Generic;
    
    /// <summary>
    /// 首先,我们写的是一个事件的类,其中有一个KeyEventArgs的参数
    /// 它是EventArgs的派生类,用来存储我们输入的字符
    /// </summary>
    
    class MyEvent
    {
        private delegate void EventHandler(object sender, KeyEventArgs e); // 这里我们声明了一个委托看清楚他的参数类型,一个object,一个EventArgs或者是它的派生类
        private event EventHandler doEvent; // 这里声明一个事件,***它的类型是委托***
        public void OnEvent(KeyEventArgs e)
        {
            // 这里用来判断,事件发生时应该调用哪一个方法,将方法加入事件处理的队列中
            switch (e.Key)
            {
                case "a":
                    doEvent += new EventHandler(FunA);
                    break;
                case "b":
                    doEvent += new EventHandler(FunB);
                    break;
                case "c":
                    doEvent += new EventHandler(FunC);
                    break;
                default:
                    doEvent += new EventHandler(FunNull);
                    break;
            }
            // 处理事件
            doEvent(this, e);
        }
    
        // 不同事件的处理方法
        private void FunA(object sender, KeyEventArgs e)
        {
            Console.WriteLine("输入 A");
        }
        private void FunB(object sender, KeyEventArgs e)
        {
            Console.WriteLine("输入 B");
        }
        private void FunC(object sender, KeyEventArgs e)
        {
            Console.WriteLine("输入 C");
        }
        private void FunNull(object sender, KeyEventArgs e)
        {
            Console.WriteLine("输入未录入字符");
        }
    }
    
    
    

    [code]csharpcode:

    using System;
    using System.Collections.Generic;
    
    /// <summary>
    /// 这是EventArgs的派生类,其中这个key就是用来储存我们输入的字符的
    /// </summary>
    
    class KeyEventArgs : EventArgs
    {
        private string key;
        public string Key
        {
            get
            {
                return key;
            }
            set
            {
                key = value;
            }
        }
    }
    
    有了上面两个类,我们的事件基本就定义好了,他们描述了(1)事件所需要的参数(2)参数所包含的内容(3)不同事件的处理方法。接下来我们要把这个事件用起来,还是看代码:

    [code]csharpcode:

    using System;
    using System.Collections.Generic;
    
    class MyListener
    {
        static void Main(string[] args)
        {
            while (true) // 这个只是为了让它能重复调用,不然用一次就没有
            {
                MyEvent me = new MyEvent(); // 实例化事件类
                KeyEventArgs e = new KeyEventArgs(); // 实例化参数类
                e.Key = Console.ReadLine(); // 给参数类中的属性赋值 
                me.OnEvent(e); // 调用事件的函数
            }
        }
    }
    
    
    先看一下结果:

    从结果看,同一个输入事件,根据不同的输入内容,调用不同的处理方法。

    总结一下,我们如何来使用事件:

    1. 声明一个特殊的委托,参数的类型为一个object,一个EventArgs或者它的派生类(如果不需要传递什么特别的信息的就直接用EventArgs);

    2. 声明一个事件,它的类型就是上面声明的委托;

    3. 声明处理事件的方法,就是如果这个事件发生了,我们需要做什么;

    4. 然后就是根据事件发生的不同情况,把不同方法加入到事件中,就是doEvent += new EventHandler(FunNull)像这样的代码。

    5. 最后一定要调用事件,如doEvent(this, e)。

    PS:很多人看了很多教程都不明白事件到底怎么写,多是因为看了别人写的好像都是不一样的,很难找出规律来。这里我归纳一下,步骤1,2,3都是为事件的发生做准备的,步骤4,5是当事件发生的时候,我们该如何去使用之前的准备去处理它。所以,1,2,3几乎都是大同小异,4,5就有可能写法多种多样了,再看别人写的关于事件的教程时,把代码分类,应该就能比较好理解了。

    以上就是小贱对委托,事件的一点浅显的理解,可能例子不合适,也有可能说的有错误,各位坛友都能直接向我提出来,我也能有机会更深入地去了解。

  • 相关阅读:
    [05] EL表达式
    [03-01] JSP自定义标签
    [04] JSP标准动作
    [03] JSP指令
    Fiddler抓包调试前端脚本代码
    《互联网协议入门》思维导图笔记
    Nodejs学习笔记(十)—与MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门
    Nodejs学习笔记(九)—与Redis的交互(mranney/node_redis)入门
    Nodejs学习笔记(八)—Node.js + Express 实现上传文件功能(felixge/node-formidable)
    Nodejs学习笔记(七)—Node.js + Express 构建网站简单示例
  • 原文地址:https://www.cnblogs.com/sbCat/p/4645786.html
Copyright © 2011-2022 走看看