我一个同窗说过“没有JDK文档的状况下,我无法写Java,可是没有MSDN的状况下,我照样写.Net的程序。”这话我十分赞同。由于Java太混乱了,不少不够合理的地方,没有文档的话,不少你想找的类,你不知道该去哪一个包里找。而C#更接近于人的思惟习惯。html
说一个我跟别人说过不少次的例子。java
---程序员
你要在代码中获取系统当前时间。你会去哪里找?至少个人第一想法是去Date类、Time类或者DateTime类里找。我在Java里找了很久,最后发如今Calendar类里。。。安全
并且Java下,这个从Calendar类获取的系统时间,要转化成Date、Time之类的东西才能在别处用,但是,印象中要从Date、Time类型的变量中提取int类型的小时、分钟神马的值,很麻烦,反而获取从19xx年1月1号开始的毫秒数很容易。但问题是,我得到这玩意以后能够干吗?用它比较时间前后却是不错。服务器
可是在C#下,你直接去DateTime类里,就能找到。DateTime类里有个属性叫Now。并且C#的DateTime类,能够很方便的获取小时、分钟什么的。函数
---.net
并且C#中能够重载运算符,直接用大于号、小于号就能够比较时间前后,用==就能够比较字符串。视频
而Java里比较字符串非得用.equals(),很纠结呀。htm
对于那些不习惯用==比较字符串的Java程序员,你在C#里也仍然可使用.equals()。索引
---
记得有人跟我讲过这样一个事:微软专门请过1000个程序员,给他们n小时,写一个读写文件的程序。结束以后,通过微软统计发现,这1000人里大部分人首先想到去找File这个类。因而微软就在它的C#里,把File作成了个静态类,专门提供各类用于读写文件的方法。
---
泛型这东西是C#首先支持的。泛型这东西,能够大大下降强制转换的次数,下降错误转换的可能性。而Java彷佛在JavaSE1.5(有多是1.6,记不清了)才开始支持泛型。因此你在写Java的时候,有些第三方jar包,为了兼容这以前的java版本,里面的方法给你返回的是object类型的东西,须要你手动转换。
---
C#下的枚举也比Java安全。Java里面的枚举直接用int强制转换过去就行,你甚至能够在不知道一个int在枚举中意味着什么,就把它做为参数传进去。而C#里的枚举是强类型,不能随意转换。
---
C#下有不少用来下降程序员由于马虎出错的可能性的东西。
好比参数的ref、in、out标记。
加了in标记的参数,你在函数里就无法对它进行赋值了。防止程序员错误的向变量写入东西,下降bug率。并且在后期维护程序的时候,负责维护的程序员看到in标记以后,就知道这个函数不管怎么改,这个参数不要动。
而加了out标记的参数,系统就会容许调用者传未赋值的变量进来。可是,无论这个参数传进来的时候有没有被赋值,系统会要求你首先对这个变量进行赋值才能使用。就是说,变量里任何已经存在的值你是无法使用的,必需要覆盖掉。并且若是方法里存在一个代码路径没有对这个参数进行赋值,系统会报错。这个也能够下降bug数量。
加了ref标记的参数,对于引用类型的东西,好比类的实例,这个ref标记加不加没有区别。可是对于值类型的参数,好比int、结构体等,就能够以传引用的方式调用了。
---
C#下,集合操做远远比Java方便。尤为是有了泛型。
C#下,几乎全部集合类型均可以转换成IEnumerable类型,IEnumerable能够用ToList()方法转换为List,并且均可以用foreach来遍历。Java里,List是抽象类,我最初接触Java的时候,找了很久都不知道为何new List()会出错。。。最后才知道要new HashSet()
C#下的Linq、Lambda表达式能够很方便的对集合查询。
---
C#的好多集合类型、Collection类型,均可以用索引器。好比List类型的strList,咱们能够直接strList[i]来获取第i个元素。Dictionary类型的someDict,咱们能够直接用someDict[someKey]来获取某Key对应的Value。
---
C#里的属性是个化繁为简的好东西。
Java里为了写一个JavaBean,你须要为每一个属性写一个千篇一概的getXXX()和setXXX方法,而在C#里你能够简单的写String someProperty{get;set;}就行。get和set也能够单独限定private、public等限定符。也能够自定义get和set访问器,以便在须要的时候进行一些关联操做。好比在set的时候能够调用OnSet之类的事件委托。
---
委托,这个也是一个极好的特性。
记得写Java的桌面应用的时候,一个类要实现MouseListener接口,而后在处理函数里判断
if(被单击的是Button1)
{/*Do something*/}
else if(被单击的事Button2)
{/*Do something*/}
......
若是窗口上的button多一些,这个函数可能要几百行,并且代码乱的不得了。可是若是是C#,能够为每一个button的click事件指定不一样的处理函数,代码清晰简洁。
在IoC的实践中,C#的委托也比Java的传接口的实例更为有优点。
---
C#下,反射比Java更易用。
并且C#里的MEF也是个不错的东西。咱们团队以前用MEF开发了一个东西,每一个模块彻底解耦合,彻底不须要知道其它模块的信息,只须要知道核心组件里的接口就能够调别的组件了。这样作到了在不影响其它模块的状况下,直接替换某组件。而核心组件正是经过MEF,以反射的方式发现组件并动态加载组件。
---
“约定优于配置”的理念
以前看MSDN的WebCast,讲Asp.netMVC2的那集,里面有句话我印象特别深“约定优于配置”。
里面的讲师开了个玩笑“你的项目里要是没有50个配置文件,每一个配置文件没有100行,你都很差意思跟别人说你写了个Java项目”。这句话固然夸张了,不过Java里面须要配置文件的地方的确很多。就拿Struts2.0和Asp.netMVC来比较。Struts2.0里你须要些配置文件告诉服务器,哪一个是Controller,哪一个是View,哪一个是Model。可是Asp.netMVC里就很清楚了,里面Controller文件夹里的XxxController文件就是名为Xxx的Controller,View文件夹里、Model文件夹里也是如此。视频的讲师当时说了一句“Controller文件夹里放的固然是Controller了,难道你真的要在View文件夹里建立一个文件名是XxxModel的Controller么?你有这个需求么?”
了解更多请点击:郑州最好的牛皮癣医院