Maximillian 的个人资料fossil照片日志列表更多 工具 帮助
4月29日

The path to summer

The path to summer is something i called mythology and miracle, caus i got memorized some sentences from Eisenhower, "duty, honor, country". However the path is too hard for me to hitch a ride, i got in trouble and hardest time of my life. When i would survive, there must be a testament of my life. The path of summer is my testament indeed.

The path of the righteous man is beset on all sides by the inequities of the selfish and the tyranny of evil men. Blessed is he who, in the name of charity and good will, shepherds the weak through the valley of the darkness. For he is truly his brother's keeper and the finder of lost children. And I will strike down upon thee with great vengeance and furious anger those who attempt to poison and destroy my brothers. And you will know I am the Lord when I lay my vengeance upon you.

A wise old man would say, "slow down boy slow down doggie, you are just a junker from middle of the earth, our life is too short to face the death ,  the lie has already been writen to history and peom." About this i could say nothing, but i must try to find out the answer by myself.

4月23日

C#与Java之比较

http://www.blogjava.net/Jack2007/archive/2008/04/19/194230.html
C#与Java之比较
很多人说C#是微软用来和Java抗衡的武器,因为二者在很大程度上有着惊人的相似
,尽管如此,两者不同的地方也很多,所谓“于细微处见差异”。那么两者的相似和区
别都在什么地方呢?我们从今天开始,会从各个角度来对比C#和Java的特点,希望能对
正在学习、使用C#的朋友有所帮助。
1、C#和.NET平台的概貌
  2000年6月,微软发布C#语言和.NET平台。C#语言是一种强类型的,面向对象的语言
,它具有语法简单、表达力强的特点,而.NET平台则是构成微软的“.NET计划”的基石

  .NET平台的核心包括两方面,一方面就是著名的通用语言运行机(Common Language
Runtime),虽然这个名词起得晦涩了点,不过大家可以拿它和Java的虚拟机来作比较,
二者完成的任务大致相同;另一方面就是一大堆通用函数库,这些库函数可以被多种语
言调用,并且通过编译都产生一种共同的中间语言(Intermediate Language),这种语
言也可以拿Java的字节码来类比,虽然完成的方式有些不一样。
2、C#和Java
  下面简单地把C#和Java的相似处列出来,虽然在这里我们重点讨论的是C#和Java的
不同点,但是了解一下二者的相同之处也是很有必要的。
  二者都编译成跨平台的、跨语言的代码,并且代码只能在一个受控制的环境中运行
  自动回收垃圾内存,并且消除了指针(在C#中可以使用指针,不过必须注明unsafe
关键字)
  都不需要头文件,所有的代码都被“包(package)”限制在某个范围内,并且因为没
有头文件,所以消除了类定义的循环依赖
  所有的类都是从对象派生出来,并且必须使用New关键字分配内存
  用对象加锁的方式来支持多线程
  都具有接口(interface)的概念
内部类
  继承类的时候不会以某种特定的访问权限来继承;
  没有全局函数或者常量,一切必须属于类;
  数组或者字符串都自带长度计算和边界检查;
  只使用“.”操作符,没有“->”和“::”;
  “null”、“boolean”和“bool”成为了关键字;
  任何变量均在使用前进行初始化;
  不能使用整数来返回到if条件语句中,必须使用布尔值;
  “Try”模块后可以有“finally” ;
3. 属性(Property)
  属性的概念对大家来说应该是很熟悉的,类成员函数可以自由地访问本类中的任何
属性成员。不过若要从一个类中去访问另一个类中的属性,那就比较麻烦了,所以很多
时候我们使用Getxxx和Setxxx方法,这样看起来显得极不自然,比如用Java或者C++,代
码是这样的:
  foo.setSize (getSize () + 1);
  label.getFont().setBold (true);
  但是,在C#中,这样的方法被“属性化”了。同样的代码,在C#就变成了:
  foo.size++;
  label.font.bold = true;
  可以看出来,C#显然更容易阅读和理解。我们从这个“属性方法”的子程序代码中
,也可以看到类似情况:
Java/C++:
public int getSize()
{
  return size;
}
public void setSize (int value)
{
  size = value;
}
C#:
public int Size
{
 get{return size;}
 set{size = value;}
}
  为了区分这种属性化的方法和类的属性成员,在C#中把属性成员称作“域(field)”
,而“属性”则成为这种“属性化的方法”专用的名词。顺便说一句,其实这样的属性
化方法在VB和DELPHI中是经常碰到的,在VB中它也就叫属性。
  另外,在C#中Get和Set必须成对出现,一种属性不能只有Get而没有Set(在Java和
C++中就可以只有Get或者只有Set),C#中这样做的好处在于便于维护,假如要对某种属
性进行修改,就会同时注意Get和Set方法,同时修改,不会改了这个忘了那个。
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和ev
ent关键字来解决这个问题。下面让我们来看一个例子,例子中会给大家举出声明、调用
和处理事件的全过程。
//首先是指代的声明,它定义了唤醒某个函数的事件信号
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;
 }
}
  在主函数中,我们创建了一个game对象和一个裁判对象,然后我们通过改变比赛分
数,来观察裁判对此会有什么响应。
  请注意,我们的这个系统中,Game对象是感觉不到裁判对象的存在的,Game对象在
这里只负责产生事件,至于有谁会来倾听这个事件,并为之作出反应,Game对象是不作
任何表态的。
  我们注意到,在裁判类的Referee函数中,Game.ScoreChange后面使用了+=和-=操作
符,这是什么意思呢?回到我们定义ScoreChange的地方,可以发现ScoreChange是用ev
ent关键字修饰的,那么这里的意思就很明白了:ScoreChange是一个事件,而事件被触
发后需要相应的事件处理机制,+=/-=就是为这个事件增加/移除相对应的事件处理程序
,而且,并不是一个事件只能对应一个处理程序,我们还可以用这两个操作符为同一事
件增加/移除数个事件处理程序。怎么样?很方便吧!
  在实际应用中,和我们上面讲的(竞赛-裁判)机制很相近的系统就是图形用户界面
系统了。Game对象可以看作是图形界面上的小零件,而得分事件就相当于用户输入事件
,而裁判就相当于相应的应用程序,用于处理用户输入。
  指代机制的首次亮相是在MSVJ里,它是由Anders Hejlsberg发明的,现在又用到了
C#中。指代用在Java语言中的后果,则直接导致了微软和Sun之间对类和指针的关系产生
了大量的争论和探讨。有意思的是,Java的发明者James Gosling非常幽默地称呼指代的
发明者Anders Hejlsberg为“‘函数指针’先生”,因为Anders Hejlsberg总是想方设
法地把指针变相地往各种语言中放;不过有人在看了Java中大量地使用了各种类后,也
戏称Java的发明者James Gosling为“‘全都是类’先生”,真是其中滋味,尽在不言中
啊。

 

 

附:

C#的swtich case要求每个case的最后要么是goto,要么是break;而Java则更像C++。goto在Java中被保留但没有用。也就是说你不能用goto这个词,Java自己也不用。

C#支持无符号数;而Java除了char之外,如int,long,double之类的都只有有符号类型,其作者宣称“无符号的类型没什么用”。这样Java的移位运算符专门设了个>>>来进行无符号位移。

C#允许重载操作符;Java不允许重载运算符。

C#在对字符串类型有特别的对待,比如直接应用==,可以在switch case里用;而Java只能用equals来比较字符串。当然啦,二者的String类都有一些特别的比较字符串的方法。

C#的Exception不是方法签名的一部分;而Java要求每一个checked Exception如果没有catch就必须写在方法签名的一部分。

C#采用关键字override进行方法覆写,如果没有这个关键字就进行方法隐藏(hide);而Java默认处理子类与父类具有相同签名的方法就是覆写。(当然,有一些访问权限上的规则和Exception声明会造成隐藏)。

C#支持ref out等参数传递方式;Java只支持值传递。在Java中不能很方便的写一个方法交换两个变量的值。

C# 的文件部署方式和逻辑部署方式是分离的。物理上用.cs文件,逻辑上用名字空间。名字空间与源文件系统无关。一个cs文件可以包含多个类;Java要求每个.java文件只能包含一个public类,并且类名要与文件名精确一致。Java的package与目录结构精确的一致。

C#使用bool表示布尔值;Java使用boolean。

C#用冒号表示类集成和接口实现;Java用extends和implements关键字。

如果不希望一个类被集成,C#用seal关键字;Java用final关键字。

C#用const表示常量,此外还有readonly关键字表示只读变量;Java用final表示常量。

在类型转换中,C#使用is和as关键字;Java使用instanceof关键字和T1 = (T1)o;这样的转换形式。

C#中可以定义自己的值类型,比如写一个struct;Java不允许定义值类型。

C#区分两种多维数组a[M,N]和a[M][N];Java只支持后一种。

C#的程序入口是Main方法,而且允许String[] args和无参两种方式;Java的入口只支持main(String[] args)而不能采用无参的形式。

C#支持与COM组件的互操作;Java则使用JNI。

C#使用lock关键字来获得对象的锁;Java使用synchrnoized达到同样的功能。

C#只能用如int[] x;来声明一个数组;而Java允许用int[] x;或者int x[];两种方式。

C#从一开始就是自动装箱拆箱的;Java到了JDK5支持这个特性。

C#从一开始就是支持枚举值的;Java到了JDK5支持这个特性。

C#从一开始就支持foreach关键字;Java到了JDK5支持了for(T t: ts)这样的语法。

C#从一开始就是支持Attribute的;Java到了JDK5支持了这个特性,并称为Annotation。

C#从2.0开始支持泛型;Java到了JDK5支持了这个特性。

C#从2.0开始支持partial class;Java没有这个特性。

C#从2.0开始支持static class;Java没有这个特性。

C#3.0又有一些新特性,Java是不支持的。比如扩展方法、Lamda表达式、对象初始化器、LINQ。

4月22日

有知者无畏

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://emileyuan.blogbus.com/logs/15927759.html

周末和良师益友吃饭,我说了最近看到的两个故事:

美国的一个死刑犯临刑时,被告之:不用给他坐电椅,会把他的血一滴滴地放干。犯人被绑在一个水龙头旁,水龙头的水慢慢一滴滴地响着,第二天早晨,犯人面色惨白,看上去真的像是被放干了血,其实他只是被绑着了。是他心理极大的恐惧让他吓死了。

另一个故事,是有三个人被要求过一座桥,三个人看了一眼,觉得没什么,才几秒钟三个人就都飞奔着都过去了。灯光一开,原来桥下面有好几条鳄鱼张大了嘴正望着桥上。当三个人被要求再从桥上走回去时,每个人都吓得面如土色,不敢过去,再开一次灯,原来在鳄鱼与桥中间还有一层网,有一个人壮着胆子过去了,但这次用了十几分钟,另两个人就是不敢过。再开一次灯,原来网上还罩了一个玻璃盖,一个人舒了口气,也小心翼翼地过去了。再看最后一个人,已经吓瘫在地,问他,他有气无力地说:万一玻璃碎了、网破了,怎么办?

W哥说:“C先生就是因为无知者无畏,所以就勇敢地去创业了!”众人大笑。嗯的确,无知者无畏,很多时候,我们就是因为不知道有那么多的困难或者危险,所以我们勇敢地去做了许多事情。等我们真的开始有了许多知识、经验、教训后,反倒会前怕狼后怕虎中间还怕老母猪。

但有足够的见识、知识、人生阅历,无论是直接的还是间接的,其实是更好的事情 - 如果我们去除了“无畏”,增加了“有备”。比如说:我们的教训告诉我们,桥下会有鳄鱼,所以我们不会不考虑桥的结实程度,只是一身是胆鲁莽地冲过去,而是随身携带足够结实的网或想办法先把鳄鱼诱导到玻璃盖里去。我们的经验可以供我们防范风险,却不应该让我们望而却步、裹足不前甚至先自己把自己吓死。

人,是如此地受控于自己的心理:有激情的人如同装上了马达,显得朝气蓬勃。在工作上有激情,积极向上的力量会让周围的人都为之鼓舞;在恋爱时有激情,周围的人总是可以感受到TA的甜蜜与幸福。而消极阴暗懦弱的心理,则会让同样的世界、同样的人活得暮气沉沉。

知识就是力量,有知者能无畏,就胜利了一大半。

4月18日

若干年前

人生的诉求无非两个,活得更久, 活得更广。 前一个好理解, 后一个其实也好理解。 若干年前, 睹一所近“人物”所著诗集,不免感慨, 原来人为了活得更广真是费尽思量。 机缘所致,那个人是我知道, 了解的, 但是不至于接近,社会能赋予他的, 他得了大半, 所以我这个还需要赋予社会的人当然是无法亲近的。 那些年, 血气方刚, 未知己更不知人, 断论, 此举不过沽名。 现在想,再论也还是沽名,那些诗, 我读过, 不喜欢, 太白, 毫无意境, 但是举国的专家学者来研讨, 在其位使然, 我也了然, 那只是一个功成名就之人的副业, 学者专家也当然了然。人在功成名就之际, 总想给自己给后人留下些什么,留下些活着的痕迹。

近来,看郑振铎的传记, 一个发现, 人竟然可以活得如此简单,一个历史上如此活跃的人, 成了简简单单的几句话。诚然, 这些话竟不成句子。 然而, 若干年后,我终于明白, 有人能记住我的生卒, 比如xxx, 生于xxxx死于xxxx,已经大不容易了,还指望有一些句子来描述自己, 实在是太让人觉得好高鹜远。 若干年前, 我就明白了, 在历史上留下一个名字, 如此之难。我们不过朝生夕殁,到头来苍蝇媾媾, 了然此生, 落得逍遥自在,可是不知所终。 这些年以后, 我们也就是你们, 在那里呢?又是怎样, 在斯图这个地方, 我们留下了什么, 做出了怎样的努力, 得了些许的报偿,挥洒了怎样的汗水和眼泪?  

我依然希望人们肯定: 我是一个知道历史的人; 我依然渴望允吸着历史的脉络,也未必知道所葬何方。

4月17日

人生的节点

蛰伏了一冬的心情终于在午夜醒来,

路灯下的微微草流露贪婪的目光,

狡诘的允吸着雨夜的恩赐。

是的, 春天来了。

 

在人生的路口,

我片刻间驻足,

竟然偶遇到一个实实在在的春天,

虽然无非是嚣嚷凡尘一个短暂瞬间,

无非是更多的生命绽放凋零的季节,

可竟然实实在在的走到我面前, 让我惊奇。

 

我惊奇,真的惊奇,

在人生的节点,

路的尽头,

走过千山却回到起点,

竟然发现一切的相似之下如此不同,

如同那个五月走过的路, 阑珊的灯光, 水波里泛起的春色,

那样诱人恬然。