您现在的位置:网络学院 > 开发教室 > 跟我学.net
总体了解C#(5 事件)

出处:PConline
责任编辑:zwg

[02-5-22 15:32] 作者:荣耀翻译/ASPCool.com


总体了解C#(5 事件)

A Comparative Overview of C#中文版

作者:Ben Albahari
公司:Genamics
日期:2000年7月31日初版,2000年8月10日修订。
感谢以下人士支持和反馈(按字母先后顺序):Don Box、 C.R. Manning、 Joe Nalewabau、 John Osborn、 Thomas Rhode & Daryl Richter。
译者:荣耀

5.事件

C#提供了对事件的直接支持。尽管事件处理一直是编程的基本部分,但令人惊讶的是,大多数语言在正式化这个概念上所做的努力都微乎其微。如果看看现今主流框架是如何处理事件的,我们可以举出如下例子:Delphi的函数指针(称为闭包)和Java的内部类适配器,当然还有Windows API消息系统。C#使用delegate和event关键字提供了一个清爽的事件处理方案。我认为描述这个机制的最好的办法是举个例子来说明声明、触发和处理事件的过程:

// 委托声明定义了可被调用的方法签名【译注:这里的签名可以理解为“原型”】

public delegate void ScoreChangeEventHandler (int newScore, ref bool cancel);

// 产生事件的类

public class Game

{

//注意使用关键字

public event ScoreChangeEventHandler ScoreChange;

int score;

// 属性Score

public int Score

{

get

{

return score;

}

set

{

if (score != value)

{

bool cancel = false;

ScoreChange (value, ref cancel);

if (! cancel)

score = value;

}

}

}

}

// 处理事件的类

public class Referee

{

public Referee (Game game)

{

// 监视game中的score的分数改变

game.ScoreChange += new ScoreChangeEventHandler (game_ScoreChange);

}

// 注意这个方法签名和ScoreChangeEventHandler的方法签名要匹配

private void game_ScoreChange (int newScore, ref bool cancel)

{

if (newScore < 100)

System.Console.WriteLine ("Good Score");

else

{

cancel = true;

System.Console.WriteLine ("No Score can be that high!");

}

}

}

//测试类

public class GameTest

{

public static void Main ()

{

Game game = new Game ();

Referee referee = new Referee (game);

game.Score = 70;//【译注:输出 Good Score】

game.Score = 110;// 【译注:输出 No Score can be that high!】

}

}


在GameTest里,我们分别创建了一个game和一个监视game的referee,然后,然后我们改变game的Score去看看referee对此有何反应。在这个系统里,game没有referee的任何知识,任何类都可以监听并对game的score变化产生反应。关键字event隐藏了除了+=和-=之外的所有委托方法。这两个操作符允许你添加(或移去)处理该事件的多个事件处理器。

[下一页]


相关文章:

C#的多线程机制初探(2)
C#的多线程机制初探(3)
C#的多线程机制初探(4)
用设计模式固化你的C#程序(1)
用设计模式固化你的C#程序(2)
用设计模式固化你的C#程序(3)
用设计模式固化你的C#程序(4)
用设计模式固化你的C#程序(5-2)
用设计模式固化你的C#程序(5-1)
用设计模式固化你的C#程序(6-2)


内容搜索 
高级搜索

本栏今日焦点