频道栏目
首页 > 资讯 > C# > 正文

总体了解C#(5 事件)

06-09-21        来源:[db:作者]  
收藏   我要投稿

5.事件

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

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

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

// 产生事件的类

public class Game

{

file://注意使用关键字

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!");

}

}

}

file://测试类

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隐藏了除了+=和-=之外的所有委托方法。这两个操作符允许你添加(或移去)处理该事件的多个事件处理器。


相关TAG标签
上一篇:总体了解C#(5 事件)2
下一篇:总体了解C#(4 委托)
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站