C#和Java的最大不同
本文摘抄自知乎。
链接:https://www.zhihu.com/question/20451584/answer/27163009
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
微软的c#设计者更注重一线开发人员的感受,为方便开发提高效率,他们愿意大费周章改善语言本身各方特性,不断加入语法糖,从泛型,nullable,隐式类型到lamada再到dynamic,await asyc等等都可看到其一直在围绕代码整洁,减少bug等实际的开发过程中问题来进行的改进,同时越来越智能的IDE也说明了这点。
而java设计者则不同,他们的关注点在于java应用系统本身,更好的降低耦合,保持OOP是其始终坚持的。同时也应该不难发现,社区对java应用架构师提出的各类尖锐问题反馈总是较为及时,而对java应用开发者则相对冷淡些。
正因此,使用java开发的大型应用系统相比同等代码量c#开发出的系统至少在系统结构上要比c#更加美观,易维护,代码变腐烂的速度也更慢。加上java及linux均为开源产品,许多大型公司又在基于成本的考虑上最终还是选择使用java进行应用系统开发。
最后拿泛型举例看看c#和java对待同一问题时各方的区别:c#在2.0中为推出泛型特性是对预编译,编译及运行时做了根本性改变的,而java设计者则显然不够"诚意",他们在预编译期直接将泛型"处理"掉了,你在运行时根本看不到泛型这一特性。我臆测java设计者可能认为即使没有泛型,应用系统设计师通过优秀的程序设计是可以解决list类型不一致问题的,这种通过添加语法规则规避问题的做法实际是懒惰思维,添加了泛型支持也只是向社区的呼声做了一次妥协。
面对同一问题采用不同处理方法的结果是,c#基于泛型后续衍生出了lamada,linq等一系列更能提高开发效率的语法利器,而java因有了泛型的强制约束使得java开源中间件变得更加稳定,同时可以看到后续的许多开源中间件产品体量也变得更大,功能也开始更加大胆。这也算是通过泛型确保类型一致带来的好处之一吧。
所以,虽语法非常相似,但关注方向并不相同的两种语言至少目前来说区分优劣为时尚早了些,但就趋势来说,c#的发展势头要更为强劲,不去关注两种语言本身,就平台而言,微软对c#的掌控力要绝对优于java社区对java平台的掌控力,c#设计者在改造c#语言时不需要做出太多妥协,他们考虑最多的只是5.0如何向4.5兼容,4.5如何向4.0兼容,而java在发展的过程中每一步跨越需要考虑的则更多。同时,最要命的,java的一切设计都是牢牢基于面向对象的,然而从实际的开发经验来看,现实世界中的许多问题并不能单纯依靠面向对象来解决,牵强使用OOP给实际系统开发已经带来不少的负面影响,例如,红苹果到底是苹果的子类还是红色是苹果的一个属性?有人会觉得这要联系上下文才能知道究竟应该如何定义这颗苹果,然而联系上下文的过程本身就是一个寻找妥协的过程,可以符合当前系统设计要求,但,不代表系统需求不会改变,而在敏捷开发中,我们首先要树立的思想便是"需求是迟早会变的",这种矛盾在面向对象的开发过程中会长期相伴。
回头再看c#,虽然其出身也是彻头彻尾的面向对象,然而在其后续的演进过程中似乎并未把OOP放在眼里,到c# 3时干脆加入了具有函数式编程特性的linq,而当其与原先就支持的委托特性结合时,其强大之处就可见一斑了,原先需要使用OOP思想编写的大量"难看"代码linq居然只要几行就能搞定,且更加符合自然语言表达。而java支持lamda似乎是linq推出整整6年(也许还不止)后的最近了。
回到问题本身回答题主,综上,C#和JAVA的区别有很多,而最大的区别在于他们的语言(平台)设计者的关注点并不相同。
手机打字,部分语句不通顺望见谅。
C#和Java的最大不同的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- Elasticsearch之java的基本操作一
摘要 接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...
- 论:开发者信仰之“天下IT是一家“(Java .NET篇)
比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...
- 故障重现, JAVA进程内存不够时突然挂掉模拟
背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...
- 死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
- 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
- Java多线程基础学习(二)
9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...
- Java多线程基础学习(一)
1. 创建线程 1.1 通过构造函数:public Thread(Runnable target, String name){} 或:public Thread(Runnable target ...
- c#与java的区别
经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...
随机推荐
- Markdown 介绍
Markdown 是目前互联网上最流行的写作语言,它使用一些简单的符号(* / ` > [] () #)来标记文本格式,其简洁的语法.优美的格式以及强大的软件支持深受广大网友的喜爱.维基百科上对 ...
- java数据结构之ArrayList
一.ArrayList源码注释 /** * ArrayList源码分析,jdk版本为1.8.0_121 */ public class ArrayList<E> extends Abstr ...
- app测试自动化操作方法之一
1.在输入框里输入字符 dr.find_element_by_android_uiautomator\ ( 'new UiSelector().text("邮箱或手机号")').s ...
- Oracle三种排名函数使用
1) SELECT s.*,Row_Number() OVER (partition by c_name ORDER BY grade desc) rank FROM score s 2) SELEC ...
- 积累-T
emmm,各种知识点都有吧,主要方便自己记 随机修改网页图标 <script> var image=new Array(3); image.length=3; image[1]=" ...
- C++学习笔记-多态的实现原理
深入了解多态的实现原理,有助于提高对于多态的认识 多态基础 多态的实现效果 多态:同样的调用语句有多种不同的表现形态 多态实现的三个条件 有继承.有virtual重写.有父类指针(引用)指向子类对象 ...
- 什么是分布式关系型数据库服务 DRDS
DRDS 产品简介 DRDS 是一款基于 MySQL 存储.采用分库分表技术进行水平扩展的分布式 OLTP 数据库服务产品,支持 RDS for MySQL 以及 POLARDB for MySQL, ...
- 什么是云服务器ECS
云服务器(Elastic Compute Service,简称ECS)是阿里云提供的性能卓越.稳定可靠.弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务.云服 ...
- .Net Core使用AutoMapper做对象关系映射
我想很多后端开发者,纠结于如何在Dto及表实体中做属性关系映射,因为真的太繁琐了., ⒈如何使用? Mapper.Initialize(cfg => cfg.CreateMap<Users ...
- Mybatis动态SQL之使用foreach完成复杂查询
一.foreach概述 对于一些SQL语句中含有in条件.需要迭代条件集合来生产的情况,就需要使用foreach标签来实现SQL条件的迭代.foreach主要用在构建in条件中,它可以在SQL语句中迭 ...