您的位置:首页 > 其它

委托、事件学习笔记

2013-08-28 09:45 176 查看
  学习c#有一段时间了,在工作或者学习中总是碰到委托和事件,行内过来人说委托和事件其实就是一个坎,没过去的总感觉到委托和事件很难理解,而过去的人说也就是那么一回事。本人现在应该是处于正在理解的边缘,托大了,其实狗屁都没理解。关于委托和事件,在网上也看了大量的资料,大牛们好像是每个牛都有自己的理解,小可也只能模仿学习,此文仅仅记录自己的学习笔记。如有侵犯大牛的地方,还望海涵。

委托:

  委托,开始的理解是将方法作为一个函数的参数进行调用。这种理解是正确的,只是站在表皮上。前几天又听一同事的讲解,别有一番风味。

  “当一个类或者是进程需要调用一个方法时,需要借助另外的类或者是进程进行调用,而这种机制就称为委托”。

  两种理解本质上是一样的,但是站的高度不一样,对问题的理解肯定不能同日而语。还有牛说:委托可以理解成为函数指针,不同的是委托是面向对象的,而且是类型安全的。

委托使用的三个步骤:

  1、声明一个委托: public delegate void processDelegate;

  2、定义一个委托对象:processDelegate pro= new processDelegate(需要调用的方法);

  3、调用方法:pro(i);

下面是一个委托示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Event
{
class Program
{
static void Main(string[] args)
{
KeyInputMonitor myMonitor = new KeyInputMonitor();

EventReceiver myReceiver = new EventReceiver(myMonitor);

myMonitor.Run();
}
}

//派生一个KeyEventArgs类,来保存按键信息
class keyEventArgs : EventArgs
{
private char keyChar;
public keyEventArgs(char KeyChar)
: base()
{
this.keyChar = KeyChar;
}

public char KeyChar
{
get { return keyChar; }
}
}

class KeyInputMonitor
{
public delegate void KeyDownHanlder(object sender, keyEventArgs e);
public event KeyDownHanlder KeyDown;

public void Run()
{
bool finished = false;

do
{
Console.WriteLine("input a char...");
string response = Console.ReadLine();

char responseChar = (response == "") ? '\0':char.ToUpper (response [0]);
switch (responseChar )
{
case 'X':
finished = true ;
break ;
default :
keyEventArgs myKeyEventArgs = new keyEventArgs (responseChar );
KeyDown (this ,myKeyEventArgs );//触发事件
break ;
}
}while (!finished);
}
}

//类先产生一个委托实例,再把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件
class EventReceiver
{
public EventReceiver(KeyInputMonitor monitor)
{
monitor.KeyDown += new KeyInputMonitor.KeyDownHanlder(monitor_KeyDown);
}

void monitor_KeyDown(object sender, keyEventArgs e)
{
//真正的事件处理函数
Console.WriteLine("capture key:{0}", e.KeyChar);
}
}
}


View Code

暂且写到此处,如果在以后有更深层次的理解,再次更改补充吧。

补充1:

委托和事件的区别:

委托:明面上是将方法作为一个函数的参数进行调用,另外一种理解是:当一个类或者是进程需要调用一个方法是,需要借助另外的类或者进程进行调用,这种机制成为委托。本质上来讲:委托是一种类型。

事件是一种特殊的委托类型。

委托和事件的区别:委托可以直接调用委托来激发委托所指向的函数,也可以由服务代码自己触发。事件的触发只能由服务代码自己触发。

通俗来说:委托可以从类内和类外进行调用注册的方法;事件只能从类内调用注册的方法,比委托要安全。

补充:

经过一段时间的学习,在本博文的基础上写了一篇:

委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: