java与C#的对比整理(1)

2021-4-19 10:12

java又开始用了半年了,说说java的新感受

一、开发环境

java开发环境用idea,不花钱激活真费劲。vs比较容易,ms应该是故意纵容的,希望提高市场占有率。

Maven vs nuget,maven安装插件时候经常出现依赖问题,或者一些杂七杂八的问题,初学安装困难。nuget一般安装了就直接能用了,规范化自动化。

二、语言对比

大部分比较相似,但是一些细节java的语法拖沓,不直观,相对比c#不停做升级,现在的c# 7.0就已经很简洁符合思维逻辑了。比较赞的是c#的扩展extensions,java没有,所以会在对集合做汇总时候,java都得用集合类辅助,而c#不用,和javascript比较接近了。还有c#的linq,查询到模型的无缝转换,非常简洁好用。

三、具体的吐槽记录

1.Java的集合和容器

java中一些集合和容器类分为线程安全和非线程安全的,c#中也一样,但是c#中的线程安全的都会放到concurrent命名空间下,相当于单独的java包中,让人用的时候自然就注意到,这点java应该学习。到现在我也有时候分不清Hashtable和Hashmap哪个是线程安全的,因为从名字上,从package上都看不出啥区别,一个是哈希表,一个是哈希映射,为啥最大的区别反而是一个线程安全一个不是呢?说到这里最无语的是java的类的命名,非常的不贴切类的实际含义,这个数据最软件开发人员最基础的素质,但是java没有,不知道为啥还有各种书吹捧java多么艺术。

2.反射

java不支持泛型类型的类型对象的直接获取,必须通过创建泛型实例调用getClass方法,比如 获取 Result<SsoUser>的类型对象,只能通过如下代码获取

 new Result<SsoUser>().getClass()

相比c#,有typeof运算符,可以直接获取类型的类型对象,比如:typeof(Result<SsoUser>),这种细节点感觉java的设计者真的很无脑。从本质上来说,我获取一个类型的对象也不应该必须通过实例去获取,类型的元数据与具体对象无关,真不知道为啥这样的设计,还是有我查不到的方法能不通过实例获取。

3. lambda表达式

从本质上来说,lambda表达式就是一个方法。java设计人员不知道哪根筋不太对,硬生生抽象成了接口,然后为了配合这种畸形表述,创造出了FunctionalInterface注解来描述这是个方法。而C# Function本身是种类型,lambda表达式隐式就可以转换成Function对象。这才是更贴切事物本质的表述和设计。

平时用到的还有很多,有时候想不起来记下来,真的java很无脑,我觉得我去设计也不会变成这样的糟糕的难理解。

 

 

点击:loading..
收藏到:中国收客网
评论