2006-11-29

对C#委托及事件委托的理解

来源: 博客园 作者:佚名 评论 1 条
 

// 组合两个委托
MyDelegate d5 = d1 d2;
d5 = d3;
d5("D5"); // M1,M2,M3

// 从组合委托中删除d3
MyDelegate d6 = d5 - d3;
d6("D6"); // M1,M2
d6 -= d3; // 虽然d6调用列表中已经没有d3了,但这样只是不可能的移除没有错误发生
d6("D6"); // M1,M2
d6 -= d6;
//d6("D6"); 此时d6的调用列表为空,d6为null,所以引发System.NullReferenceException

MyDelegate d7 = new MyDelegate(C1.P1);
d7("D7"); // C1.P1

MyDelegate d8 = new MyDelegate(new C2().P1);
d8("D8"); // C2.P1

}
}

// 声明一个委托MyDelegate
public delegate void MyDelegate(string str);

public class C
{
public static void M1(string str)
{
Console.WriteLine("From:C.M1: {0}", str);
}

public static void M2(string str)
{
Console.WriteLine("From:C.M2: {0}", str);
}

public void M3(string str)
{
Console.WriteLine("From:C.M3: {0}", str);
}
}

public class C1
{
public static void P1(string str)
{
Console.WriteLine("From:C1.P1: {0}", str);
}
}

public class C2
{
public void P1(string str)
{
Console.WriteLine("From:C2.P1: {0}", str);
}
}
}

事件委托

事件概述

事件就是当对象或类状态发生改变时,对象或类发出的信息或通知。发出信息的对象或类称为"事件源",对事件进行处理的方法称为"接收者",通常事件源在发出状态改变信息时,它

并不知道由哪个事件接收者来处理.这就需要一种治理机制来协调事件源和接收者,C 中通过函数指针来完成的.在C#中事件使用委托来为触发时将调用的方法提供类型安全的封装


事件的声明

1.声明一个委托
public delegate void EventHandler(object sender, System.EventArgs e);

2.声明一个事件
public event EventHandler Changed;

3.引发一个事件
public OnChanged(EnventArgs e)
{
if ( Changed != null)
{
Changed(this,e);
}
}

4.定义事件处理程序
public MyText_OnChanged(Object sender,EventArgs e)
{
...
}

5.订阅事件(将事件处理程序添加到事件的调用列表中)

myText.Changed = EventHandler(MyText_OnChanged);

下面的一个小例子说明了怎样定义一个完整的事件机制:

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

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyText myText = new MyText();

// 将事件处理程序添加到事件的调用列表中(即事件布线)
共3页: 上一页 [1] 2 [3] 下一页

(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:JSP高访问量下的计数程序  
下一篇:运用加密技术保护Java源代码
    评论加载中…
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号