您的位置:首页 > 编程语言 > C#

C#中的委托与事件

2013-02-07 18:47 288 查看

概念

委托

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。委托用于将方法作为

参数传递给其他方法。在方法重载的上下文中,方法的签名不包括返回值。但在委托的上下文中,签名的确包括返回

值。换句话说,方法和委托必须具有相同的返回值。

委托的声明

public delegate void EventHandler();		//无参数,无返回值


事件

事件则是委托的一种特殊形式,发生有意义的事情时,事件对象处理通知过程。或对象可以通过事件向其他类

或对象通知发生的相关事情。 发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。

事件的声明

public event EnentHandler Update ;		//声明一个“EventHandler”的委托事件


委托和事件的使用

//通知者接口
interface Subject
{
void Notify();
string SubjectState
{
get;
set;
}
}
//StockObserve类
class StockObserver
{
//构造函数对StockObserver类进行赋值
private string name;
private Subject sub;
public StockObserver(string name, Subject sub)
{
this.name = name;
this.sub = sub;
}
//方法“通知”
public void CloseStockMarket()
{
Console.WriteLine("{0}{1}关闭股票软件,赶快假装工作!",sub.SubjectState ,name );
}
}
//看NBA直播的同事
class NBAObserver
{
//构造函数对StockObserver类进行赋值
private string name;
private Subject sub;
public NBAObserver(string name, Subject sub)
{
this.name = name;
this.sub = sub;
}
//方法“通知”
public void ShutDownNBADirect()
{
Console.WriteLine("{0}{1}关闭NBA直播,赶快假装工作!",sub.SubjectState ,name );
}
}

//声明委托
delegate void EventHandler();
//boss类
class Boss : Subject
{
//声明一个事件Update,类型为委托EventHandler
public event EventHandler Update ;

private string action ;     //用于记录前台状态的变量

public void Notify ()
{
Update ();                  //在访问方法“Notify”时,调用update 事件
}

//返回和对前台状态进行读写
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
//Secretary类
class Secretary : Subject
{
//声明一个事件Update,类型为委托EventHandler
public event EventHandler Update;

private string action;     //用于记录前台状态的变量

public void Notify()
{
Update();                  //在访问方法“Notify”时,调用update 事件
}

//返回和对前台状态进行读写
public string SubjectState
{
get { return action; }
set { action = value; }
}
}


客户端代码

static void Main(string[] args)
{
//老板陈
Boss chen = new Boss();

StockObserver  tongshia = new StockObserver("陈易得",chen );
NBAObserver tongshib = new NBAObserver("陈德清",chen );

chen.Update +=new EventHandler(tongshia.CloseStockMarket );
chen.Update += new EventHandler(tongshib.ShutDownNBADirect );

//老板chen回来了
chen.SubjectState = "老板chen回来了!!!!";
//发出通知
chen.Notify();

}


通过 委托EventHandler将,将“看股票者(stockobserver)”的closestockmarket方法挂钩到老板的更新上,同时将Shu

tDownNBADirect的方法挂钩到update上,也就是将两个不同类的不同方法委托给老板类的更新了。

委托具有以下特点:

委托类似于 C++ 函数指针,但它们是类型安全的。

委托允许将方法作为参数进行传递。

委托可用于定义回调方法。

委托可以链接在一起;例如,可以对一个事件调用多个方法。

方法不必与委托签名完全匹配。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: