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

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

原文地址:https://www.cnblogs.com/sbCat/p/4645786.html