最近公司的后台使用c#作为开发语言,我也就把自己的方向有C#转到了java来了,使用了一段时间的c#开发,在这里做一点总结一下自己关于c#和java的认识
1.相同之处
- 面向对象语言
作为高级语言,c#和java都具有面向对象的特性,不过由于历史问题,java的面向对象做得不是很彻底,也就有了Integer、Double之类的坑爹东西了。而c#好像到6.0还是保留着值类型、并不是想像js等脚步语言一样彻底的面向对象。
- 命名空间(C#)或包(java)之类的机制做访问控制
c#命名空间说白了就是隔离程序,使不同命名空间的程序可以取相同的名称,通过命名空间限定,就能够对具有相同名称的程序做到分辩。但是c#和java不同的是,c#有个程序集的概念,将一个项目的所有资源看作了一个统一的单元,这个是与.NET本身的机制有关的,目前还不是很了解。而java的包机制功能和命名空间都是差不多的,java的包通常按照:组织.项目.模块.xxx的机制命名。
- 泛型编程
范型编程接触得比较少,不过他的功能很强大,写好了,能够省略大量的代码。不过我不是很了解,就不做描述。
- 特性(C#)和注解(java)之类的元语言支持
java和c#的这个特性我就知道与反射机制有关。
- 反射机制
java动态的获取对象属性和调用对象方法,加在程序编译时完全未知的类,甚至可以运行时生成程序。
- lambda表达式(java支持比较慢)
函数表达式,我知道的一个好处就是让代码更优雅,更简洁。不过java支持得比较慢,到了java8才有这个特性。
- 2.不同之处
- c#语法糖
有许多便利的操作,比如??代替三目运算符,int?之类的可空值类型,?.之类的
- linq对象操作
对数组和集合操作非常方便,可惜java没有
- c#的属性字段
可以用get和set关键字定义属性的get和set方法,不过我很好奇,字段已经是public了,可以直接访问,这个属性有什么意义。我猜的是可能是可以通过关键get和set定义访问规则,有可以直接通过字段名访问,不像java要通过getter和setter方法来做,要方便许多吧。
- 委托
委托可以将一个函数作为参数传递给方法调用,适合做回调,不够接口好像也可以干这种事情啊,还是我太年轻了。
- 命名规范
都是驼峰命名,不过c#的方法和属性第一个字母是大写,有点不习惯。
- 对加锁的处理方式不同
java是通过synchronize来自动加锁,自动释放锁。而c#有lock和unlock手动加锁和解锁。
- java默认支持多态
c#好像要通过virtual和override来声明。
- java更开源
java从一出生便拥抱开源,在开源社区混得风生水起的,有许多的大牛为java贡献了非常多的优秀代码,所以java的开源资源非常丰富。不过最近,.net已经全面开源了,.net asp的跨平台开源实现已经放出来了,相信再过不久,也会有许多的开发者不断的涌入.net正营。
- java的第三方库更丰富
当然,java是开源的,确实有像apache这样的组织为java贡献代码。
差不多就这些了,还有一些比如c#保留不安全代码,com对象的调用之类的不了解就不说了。