【转】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就有可能写法多种多样了,再看别人写的关于事件的教程时,把代码分类,应该就能比较好理解了。

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

时间: 2024-10-15 07:04:43

【转】C#笔记之委托(Delegate)(二)的相关文章

【转】C#笔记之委托(Delegate)(一)

原文: 小贱学C#笔记之委托(Delegate)(一) 本来因为之前接口那篇文章很多坛友给提了一些意见,花了一上午事件码了篇接口和抽象类比较和理解,谁知道...谁知道...不就打错了验证码么,木有了全都木有了?!恢复的只有一个标题好伤心~要再来一遍,今天是真没那个心情了,收拾收拾我这受伤的心灵,换个话题,抽象类就等下一回吧!好了,开始! 首先我们先理解下委托到底有什么用.我的理解呢就是,我找个人帮我干活,嘿嘿~不理解?等我给你个情景,一个是我家里没请保姆,一个是我请了个保姆. [code]csh

Unity3D游戏开发之委托(Delegate)

Unity3D游戏开发之委托(Delegate) 1.定义 delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用". 它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m. delegate是面向对象.类型安全.可靠的受控(managed)对象.也就是说,运行时能够保证delegate指向一个有效的方法,你无须担心

读书笔记(委托)

委托回调静态方法和实例方法有何区别 当委托绑定静态方法时,内部的对象成员变量_target会被设置成null 当委托绑定实例方法是,_target将会设置成指向该实例方法所属的一个实例对象 当委托被执行时,该对象实例将会用来调用实例方法 1 class DelegateReturn 2 { 3 public delegate String GetStringDelegate(); 4 5 static string GetTypeName() 6 { 7 return typeof(Delega

C++实现委托机制(二)

C++实现委托机制(二) 1.引言:              上一篇文章已经介绍了如何构建一个无参数无返回值的函数指针的委托,这篇文章将对上一文章所述委托进行扩展,使得可以注册任意函数指针,不过再讲篇内容之前先要介绍一下实现这个功能所需要了解的C++11的一个新特性———可变参数模板. 2.可变参数模板:              template(模板)是源于将类型和实现(算法)分离开的思想,为了让写好的算法适用于更多类型使得出现了模板,模板使得参数类别任意化,如果再加上“参数个数的任意化”

重构笔记——隐藏“委托关系”

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43769929         在上一篇文章中介绍了"将类内联化".本文将介绍"隐藏委托关系"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:客户通过一个委托关系来调用另一个对象. 解决:在服务类上建立客户所需的所有函数,用以隐藏委托关系. 动机 我们都知道,"封装&q

读书笔记-HBase in Action-第二部分Advanced concepts-(3)非Java客户端

HBase Shell HBase shell使用起来最方便,进入HBase shell控制台即可使用. $ $HBASE_HOME/bin/hbase shell 常见操作有create(创建表)/put(插入或更新数据)/get(根据rowkey查询)/scan(范围查询)/delete(删除列)/deleteAll(根据rowkey删除整行数据)/disable&drop(禁用表之后再删除). 基于数据库的项目,往往会在某个目录下存储专门的sql脚本,记录每次迭代数据库变更:同理,HBas

读书笔记-HBase in Action-第二部分Advanced concepts-(1)HBase table design

本章以山寨版Twitter为例介绍HBase Schema设计模式.广义的HBase Schema设计不只包括创建表时指定项,还应该综合考虑Column families/Column qualifier/Cell value/Versions/Rowkey等相关内容. 灵活的Schema&简单的存储视图 Schema设计和数据存储及访问模式关系密切,先回顾下HBase数据模型,有几个要点: 被索引的部分包括Row Key+Col Fam+Col Qual+Time Stamp 由于HBase的

C++语言笔记系列之十二——C++的继承

C++的继承 1.继承方式 public(公有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象只能访问基类的public成员. protected(保护继承),private(私有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象不能访问基类的任何成员. 2.例子 example 1: #include <iostream.h> clas

Halcon学习笔记之支持向量机(二)

例程:classify_halogen_bulbs.hdev 在Halcon中模式匹配最成熟最常用的方式该署支持向量机了,在本例程中展示了使用支持向量机对卤素灯的质量检测方法.通过这个案例,相信大家可以对支持向量机的使用有一个更加清晰的了解.在相当多的检测和识别的应用中,都可以使用相同的方法来解决分类问题. 图1. 卤素灯图像 大致原理: 一.准备阶段:描述样本 1. 准备好两组卤素灯图像样本,好坏的各若干张图像: 2. 对样本图像进行分割,获取卤素灯关键部位区域: 3. 选择合适的对图像的描述