C#更接近于人的思惟习惯

  我一个同窗说过“没有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么?你有这个需求么?”

  了解更多请点击:郑州最好的牛皮癣医院

  郑州最好的白癜风医院

  郑州白癜风医院

  河南白癜风医院

相关文章
相关标签/搜索