C#与Java之比较

发表于:2008-5-13 14:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:网络转载

分享:

4、对象索引机制(Indexer)

        C#中引入了对象索引机制。说得明白点,对象索引其实就是对象数组。这里和上一节中的属性联系起来讲一下,属性需要隐藏Get和Set方法,而在索引机制中,各个对象的Get或者Set方法是暴露出来的。比如下面的例子就比较清楚地说明了这一点。

public class Skyscraper
{
 Story[] stories;
 public Story this [int index] {
get {
 return stories [index];
}
set {
 if (value != null) {

stories [index] = value;
 }
}
 }
...
}

5、指代(Delegate)

        指代这个玩意很特别,它有点象指针,但又不完全是,不过大家还是可以把它理解为一种类型安全的、面向对象的指针。(什么是类型安全和面向对象就不用讲了吧?)顺便提一句,有很多书上把Delegate翻译成代理,我觉得这样翻不够确切,翻译成“指代”更恰当些,道理上吻合,并且还符合它的本来意思——微软本来就是用Delegate来“取代指针”,所以叫“指代”,呵呵。 说起指代,也许至今Sun还会对它愤愤已,为什么呢?因为在Sun的标准Java中是没有这个东西的,它是微软99年发布的MSVJ++6添加的“新特性”。为此,两家公司吵得不亦乐乎,并且还专门在网上写了大量文章互相攻击,有兴趣的朋友可以去看看(只有英文版)。

http://www.Javasoft.com/docs/white/delegates.html
http://msdn.microsoft.com/visualj/technical/articles/delegates/truth.asp

        话归正传,指代有什么特点呢?一个明显的特点就是它具有了指针的行为,就好象从Java又倒回到了C++。在C#中,指代完成的功能大概和C++里面的指针,以及Java中的接口相当。但是,指代比起C++的“正宗指针”来又要高明一些,因为它可以同时拥有多个方法,相当于C++里面的指针能同时指向多个函数,并且是类型安全的,这一点体现它的“对象”特性;而比起Java的接口来,指代高明的地方在于它能可以不经过部类就调用函数,或者用少量代码就能调用多种函数,这一点体现了它的“指针”特性。呵 呵,很有“波粒二象性”的味道吧?指代最重要的应用在于对于事件的处理,下一节我们将重点介绍。

6、事件(Event)

        C#对事件是直接支持的(这个特点也是MSVJ所具有的)。当前很多主流程序语言处理事件的方式各不相同,Delphi采用的是函数指针(这在Delphi中的术语是“closure”)、Java用改编类来实现、VC用WindowsAPI的消息系统,而C#则直接使用delegate和event关键字来解决这个问题。下面让我们来看一个例子,例子中会给大家举出声明、调用和处理事件的全过程。//首先是指代的声明,它定义了唤醒某个函数的事件信号

public delegate void ScoreChangeEventHandler (int newScore, ref bool cancel)
; /定义一个产生事件的类
public class Game
{
 // 注意这里使用了event关键字
 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.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;
game.Score = 110;
 }

}


32/3<123>
重磅发布,2022软件测试行业现状调查报告~

精彩评论

  • wasong
    2008-5-26 15:14:22

    12

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号