读《C# 和 Java 的比较》有感

网上的一篇《C# 和 Java 的比较》(或者叫《Java 和 C# 的比较》)写的挺不错的,今天忽然搜索到。

自己刚刚接触C#,也不由自主地随时都拿来和Java做对比,所以就心血来潮在原作者的每一条之后斗胆都写了些文字。就当是给自己再加深一遍印象吧。

【非常抱歉,由于网上此文章已经被转载多次,所以真的找不到原出处了,所以没法贴出作者原贴的连接】

开始吧...

2007年11月1日    1。访问控制方面:C#有public、internal、protected、private,比java多了个internal,其实它跟java的包访问差不多,internal表示同一个编译集合(如exe、dll)下的类可以互访。    对于protected,java和C#有区别。在java中,protected和包访问级别差不多,即不是私有的。而在C#中,protected和private差不多,即它标志的成员是私有的。    有这样一种情况:类中的一个成员,需要它能被子类访问到,同时能被同一个集合中(无论是java的包还是C#中的编译集合)的其他类访问到,怎么办呢?在java中,只要用protected就行了。在C#中,可以同时指定internal protected(二者的顺序随意)。    在有这样一种情况:类中的一个成员,需要它能被子类访问到,但不能被同一个集合中(无论是java的包还是C#中的编译集合)的其他类访问到,怎么办呢?在C#中,可以指定protected(二者的顺序随意)。但java就无能为力了。

评论:我很喜欢C#的internal,在Java如果一个为API中某些类提供服务的类,为了不对外暴露,只能用包级私有,并和被服务的类放在一个包中,如果有多个包中的类都要被服务,就没法办了。而C#的internal就很好的仅限当前“集合”(可能有多个namespace)中的类访问。

但是,我又不喜欢C#的“集合”的感念。反射的时候还必须给出DLL或EXE的文件名(如果不在当前DLL或EXE中),而Java是不需要的,只有在WEB-INF/classess和lib 下的都可以。特别是当API要反射它的调用者时,作为类库的DLL怎么知道哪个EXE在调用自己?

2。C#中有static constructor的概念,这跟java中的静态初始模块一样。      C# : static [类名]{}       java :static{}

批注:原来是这样写,我找了半天也没搜到C#中的静态代码段如何个写法,如今得来全不费工夫。

3。Java中的main函数必须是public static void main(String[] args)的样子,否则虚拟机拒绝运行。C#中,Main函数可以是private的(甚至可以是protected),可以没有参数,可以返回int值。有点像C语言。  4。发现csc.exe有一个功能很好,100后面加一个小写的L,它会警告:“l”后缀容易与数字“1”混淆;为清楚起见,请使用“L”。

批注:MS的人性化关怀呀。

5.C#提供了一种机制,使得某个变量可以被动态赋值一次,以后就不能再改了。那就是readonly关键字的功能。

批注:这个机制可能在特定场合下很有用。比如:抽签,这样你就不能耍赖了。

6.java在继承、多态方面,比C#强多了。Java默认的多态,C#要求加上virtual(被继承的方法)和override(继承的方法),而且C#要求不能改变原来的访问修饰符,不像java那样,可以指定更加宽松的访问方式。如果有人利用C#来写程序,必须经常带上virtual和override,还必须照抄原来的访问控制符,不会很郁闷吗?难道有人用C#的面向对象特性时,会舍弃多态的特性?这会引起多大的混乱啊。    多态是面向对象的精髓,像java那样默认不是更好吗?

批注:C#号称和Java有90%的相似性,但它必将是从C++发展而来的,在虚函数的概念上还是延续着C++的方式。习惯了Java之后,真的是感觉别扭。Java多好:默认情况下都是虚函数,允许被子类重写,但是对于有意不想让子类重写的方法用final关键字来修饰。

7. C#中new还可以用来指定子类的某个方法要隐藏父类的具有相同签名的方法。这是不是多余的?你不用也可以,不过csc.exe会警告你,如“lan.Other.Main(string[])”隐藏了继承的成员“lan.HelloWorld.Main(string[])”。如果是有意隐藏,请使用关键字 new。  像java那样默认多好啊。  但是话又说回来,C#这样做也是有原因的。如果类B继承了类A,B接下来有添加了一个方法叫做hi(),那是B特有的。然后类A(假设是别人来维护的,你不能看到源码)突然也增加了一个方法hi()。如果B自己那个hi()跟A那个hi()的返回值不一样,当你更新类库A后,可能导致程序运行错误或不能编译。C#就很好就地避免了这种问题。(虽然这种问题出现的概率挺小的…)

批注:其实这个还是和6有关,总之对于Javaer来说就是两个字“别扭”。那些非虚函数干脆就不允许改写就得了,像Java的final那样。干嘛“既要做婊子又要立牌坊”呀,当警告超过一定数量时,估计就掩埋了,不容易被注意到。而真等到了使用的时候,哪一个是多态?哪一个是“另起炉灶”?使用者不晕菜才怪呢!

8.C#中,防止一个类被继承,要用关键字sealed。而定义一个常量时,要用const。    像java统一用final多好啊。

批注:这倒没什么,关键字都一样了,显得人家MS多没水平吗。我们只是需要再多记住一些东西就是了,多无奈呀。

9.在C#中,要比较两个引用变量是否指向同一个对象,不能用java中的= =,而要用Object里的ReferenceEquals方法。C#中,不能用一个类的实例去调用该类的类方法,必须用类名。所以java中的o1= =o2等价于C#中的Object.ReferenceEquals(o1,o2)。

批注:都是操作符重载惹的祸。Equals就是Equals;ReferenceEquals就是ReferenceEquals。但 == 可要注意了,有的时候是 Equals 有的时候是 ReferenceEquals。== 被重载了,我反而更不敢用了,还是稍微费点事写 Equals 和 ReferenceEquals 吧,即不会犯错误,有意义清晰。

10.C#中没有原始类型的包装类,但是也提供自动装拆箱的功能,和java有的一样。区别是,C#的装箱是自动的,拆箱就要强制转换了。  int i=100;  object obj=i;  i=(int)obj;  具体怎么装和拆,我们不知道。只知道CLR将int转换成object了。

批注:包装类还是有的吧?如:int -> Int32;string -> String;甚至 object -> Object。是我的理解有误吗?至少从VS中关键字高亮的颜色就能区分开。

11.java的内部类有时候帮助很大。到了C#那,就只提供静态的内部类了。这意味着外部类只相当于是一个命名空间而已。C#中的内部类能访问外部类的私有成员,这可能会让它有点用。

批注:这一点我没什么研究,在Java中也是尽量不使用嵌套类。其实静态成员类+内部类(含:非静态成员类、匿名类、局部类)=嵌套类。如果要用也最好优先使用静态成员类,内部类最好少碰,尤其是匿名类(但有些地方还必须用它,矛盾呀)。

12.C#中虽然有运算符重载,但是为了整个.net的一致性,应该不会鼓励使用。因为有的.net语言没有运算符重载,而.net的一个目标就是消除各种语言的差别。

批注:用惯了Java的人想必也不会要这个“上天所赐”的。仅一个 == 就被MS自己重载成了9中的样子(其实,人家重载得还是很不错的,只是咱们在用的时候头脑不灵光)。你希望像 BigDecimal 这样的值类重载 + - * / 吗?又是 仁者见仁,智者见智了吧?

13.C#多了一个struct值类型,它就跟原始类型一样。微软在必要的时候会帮你将struct封装成Object,就像封装int类型一样。以至于你可以认为struct也是由Object继承而来,虽然struct本身并不支持继承。(struct可以不用new来初始化,但它里面的内容必须初始化后才能调用其方法;struct没有析构方法;struct没有默认的构造方法)。

批注:struct在C#中出现的原因我还真不敢乱猜,从C/C++沿袭而来?还是像MS说的在性能上略微优于class?总之,只要知道在构建值类的时候,可以使用之就可以了。

2007年11月2日  1.java中类的访问控制符只能是public,或者没有(即默认的包访问)。但是C#中,class和interface的访问控制符可以是public / private / internal / protected / internal protected。当然你必须先取得对类的访问,才可能访问到类的成员。

一个C#集合中可以包含多个public的类或接口,跟文件名没有关系。

批注:MS没有像Sun那样给namespace的命名方法一个官方的建议(Sun建议package的命名法为域名的逆序,均为小写字母)。而且.Net也不要求按目录及文件名保存类(Java最早也没有此要求)。哪种方式更好呢?我想还是一个习惯问题,至少我还是觉得Java的方式更清晰明了。而不少.Net的工程,打开后所有的Source文件都在一个“大平层”,很难受的说。

2.C#中的接口不能包含常量,而java可以。

批注:接口中应该/可以包括常量的定义吗?公说公有理,婆说婆有理。个人认为,即使Java运行,也尽量别这么做。

3.C#中的as和java中的instanceof功能一样。但C#提供一个据说是效率更高的as关键字。

批注:原作者笔误吧?是否应该是 is ? as 是强制类型转换,和更常见的 变量a = (类型)变量b; 不同的是,如果转换失败as会返回null,而括号式转换回抛出异常。as的语法和AS3语言中是相同的。

4.接口和抽象类在C#和java中都差不多,这里提一下接口设计和抽象类设计的区别之处。如果你更改了一个接口的设计,比如增加了一个方法,使用你以前的代码的用户将不得不改变他们的代码,否则不能运行和编译。但是如果是一个抽象类,你可以提供一个含默认实现的方法,用户的代码则不需要改变。

批注:这个事实在Java和C#中都是一样的。但是,就接口和抽象类(即使包括骨架类)的选用依据可不是这个,这只是一个表现而已。再有,接口一旦发布了,就是你对外的一种承诺。之后即使是版本升级也不能再做任何改动,哪怕是增加新方法。那非要增加怎么办?如果同时提供的骨架类也控制在你的手里,可以通过在这个骨架类(其实就是抽象类的一种用法,骨架类实现接口,实际类再继承这个骨架类,骨架类中可以为实际类实现一些通用的、或默认的方法)提供一份新增方法的默认实现来达到目的。但这并不是明智的,因为版本升级时需要增加的新方法,往往是一些实实在在的干活儿的方法,在骨架类中给出一个默认实现往往没什么实际意义。更好的做法,是写一个新的接口去继承原来的接口,把新增的方法在子接口中声明。这样可以保持100%向前兼容,需要实现新方法的类属于伴随此次接口升级或日后要取实现的类。

5.C#中一个类实现一个接口时,它的相关方法不必指明override;但一个类继承一个抽象类的抽象方法时,必须加上override,否则视为隐藏。(事实上,只有抽象方法或者是virtual、或者是接口方法才能被覆盖即override。不能无缘无故地override。)

批注:这个也没什么好说的,各家有各家的写法,如果非要说也还是习惯的问题。同上半篇的6。

6。C#中存在一个“多态起始点”的问题。如果一个类实现了接口的某个方法,只是接口到该类才有多态的功能,若要这种多态继承下去,该类必须指明是virtual,多态起始了,接下来的子类提供override就能多态了,不需要更多的virtual。

但是抽象类的抽象方法默认就是一个多态起始点,后续的子类只要override就行了。

批注:感觉还是同上半篇的6。也许是我还没深刻理解?

7.当一个类实现了两个接口,两个接口有一个相同的方法定义,C#有一种解决机制,叫做显示实现。Java干脆就不处理这种情况,反正实现之后就能调用了,不必指明是哪个接口的,留给程序员自己考虑。  当然C#中的显示实现还有其他功能。举个例子,接口A有一个方法叫做f(),类B实现了A。按理说B的实例就能自由调用f()了,但是如果有这样的要求:B的实例只有被cast成A之后才能调用f()。在java中,这样无理的要求是不允许的。但是C#可以做到,就是通过显示实现的方式。有谁会使用这样的特性?

批注:两个接口如果定义了相同的方法,方法名、参数个数、参数类型、返回值类型、可能抛出的异常(这个C#真没有)都一样的话,那实现它的时候,还区分是来自哪个接口的干吗?有这个必要吗?Java在这里“犯傻”我看挺好。

推荐个文章:从海底捞的火锅和路边的煎饼谈谈用户体验

读《C# 和 Java 的比较》有感

时间: 2024-07-28 17:45:21

读《C# 和 Java 的比较》有感的相关文章

读<反欺骗的艺术>有感

月初收到了csdn寄来的书<反欺骗的艺术 ---- 世界传奇黑客的经历分享>. 之后就把书放床头, 每天晚上看上一会.直到今天, 才看完了这本书.挺有感触的. 之所以当初选择看这本书, 完全是被作者吸引来的.凯文·米特尼克((Kevin David Mitnick,1963年-),出生于美国洛杉矶,有评论称他为"世界头号黑客".他在15岁时就破解北美空中防务指挥系统成功,在他16岁时就被逮捕,他也因此而成为了全球第一名网络少年犯.)而如今, 这位历史上最令FBI头痛的计算机

一本好看的书————《反欺骗的艺术——世界传奇黑客的经历分享》

??      參加了csdn举办的活动,我有幸得到了这本书--<反欺骗的艺术--世界传奇黑客的经历分享>.该书的作者可谓大名鼎鼎(以前臭名昭著),他叫米特尼克,号称世界头号黑客.以前有着"显赫的战功",以前是历史上最令FBI头痛的计算机顽徒之中的一个.刚刚拿到这本书的时候,觉得这是一本写黑客供方技术的书籍.细致读了几页发现书中讲了黑客技术中"人的因素".的确,眼下的技术的发展趋势,让我们越来越重视技术本身.而一个个残酷事实告诉我们,现实生活中安全问题是

《反欺骗的艺术》读后感

为了配合CSDN的读书送书活动,在收到此书后第一时间就翻阅起来,正好利用3天假期时间进行了阅读并写下这篇读后感,假期也因此变得充实起来. 书的全名为<反欺骗的艺术--世界传奇黑客的经历分享>,原书的作者是有世界第一黑客之称的米特尼克,而译者为我们所熟知的潘爱民博士,从作译者的强大阵容来看,相信这本书的质量一定上乘. 当我刚拿到书的时候,看到这本书的书名--<反欺骗的艺术>,觉得有点茫然,不知道这本书究竟是讲什么方面的内容,而当我看了序言以及里面的"故事"的时候,

《反入侵的艺术——黑客入侵背后的真实故事》书评

说是书评,但限于本人词穷,表达能力也有限,叫读后感或许更好一些. 一. 前言简介 凯文·米特尼克(Kevin David Mitnick),世界范围名声最大,影响最高的黑客,没有之一. Mitnick也许就是黑客的代名词.美国司法部仍然指责他为"美国历史上头号电脑犯罪通缉犯".他的所作所为被记录在两部好莱坞电影当中:<Takedown>和<Freedom Downtime>. 15岁时,Kevin Mitnick用打工赚的钱买了一台计算机,当他"闲逛&

我读经典(6):读《文明之光》有感

什么是文明?如果突然问大家这个问题,那么你可能会不知如何回答,感觉这是一个只可意会但不可言传的概念. 在新书<文明之光>中,吴军老师为我们带来了答案.继<浪潮之巅>和<数学之美>之后,吴军老师又出力作<文明之光>,将世界各地的主要文明为我们一一呈现和讲解.整套书现在出了第一册和第二册,加起来一共有16章.在这16章中,作者基本按照时间的顺序,从最古老的古埃及文明讲起,一直到美苏在航天方面的竞争为止,为大家展示了一幅生动有趣的历史画卷.全书文笔流畅.语言优美.

读《何谓文化》有感

一.文化到底是什么? 最近在看余秋雨先生写的<何谓文化>,虽然自己也没有什么文化,但是感觉还是从中学到了一点东西,想要记录下来,.也让我开始思考一些生活中的文化. 既然说何谓文化,那就需要对文化来做一个定义,余秋雨先生的定义是:文化,是一种包含精神价值和生活方式的生态共同体.它通过积累和引导,创建集体人格. 这个定义里面有几个关键词语,分别是精神价值.生活方式.集体人格.我们经常会听到这样一个词语,文化差异,可是这个文化差异的直接体现就是在精神价值和生活方式上.经常会听到不少跨国婚姻,因&qu

读《软件随想录》有感

今天拿到Joel的<软件随想录>,读了一个章节,章节题名--我的第一次BillG审查. 这个章节中,Joel讲述了他在微软任职"excel"Program Manager时的经历.这里说到的BillG审查,说的就是比尔盖茨会审查报告.众所周知,比尔是个程序员出身的Boss,在微软中一直扮演的就是教父级的人物.但是好像看来这个BillG审查有点事必躬亲的味道. 今天,我们已经反复地通过各种论点来支撑了,一个Boss事必躬亲必然会导致其他职业的无能.但是Bill为什么还要审核,

我读经典(4):读《打造Facebook》有感

我第一次听说Facebook,是在用了国内的人人网很久之后.从上大学到研究生毕业,我几乎每天都要上人人网,发发日志.照片,看看其他同学有什么动向等等.个人感觉人人网使用起来非常的方便,拉近了人与人之间的距离,比QQ舒服多了. 某一天,我读到了一篇文章,主题是有关人人网的.文章里面说,人人网是中国的Facebook.这时,我便对Facebook产生了兴趣,接着上网去百度了一把,才知道它是全球最大的社交网络,于2004年2月4日正式上线,其主要创始人为美国哈佛大学的辍学生马克·扎克伯格(很有意思,比

知物由学 | 基于DNN的人脸识别中的反欺骗机制

"知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物由学"希望通过一篇篇技术干货.趋势解读.人物思考和沉淀给你带来收获的同时,也希望打开你的眼界,成就不一样的你.当然,如果你有不错的认知或分享,也欢迎通过邮件([email protected])投稿. 以下是正文: 本文作者:ArturBa?maga,YND的AI专家. 想象一下,只需使用脸部即可解

第8周读书笔记-读《编程珠玑》有感

读<编程珠玑>有感 <编程珠玑>(后文简称<珠玑>)在序章中就开宗明义地提出了两个问题:一个是如何对实际问题进行抽象,找出问题的独特性质.二是一个富有意思的小题目:"如何在1MB内存内对0~10^7内若干元素组成的集合内的整数进行排序(10s内)".一开始我想到的是归并排序,但是书中提出可以利用位图的位向量,不用考虑任何排序算法,只需要遍历两次即可,忽然就有茅塞顿开之感,从这个简单的例子中就可以对一些思想窥见一斑:位图数据结构.简单的设计.时间-空间