C#可以算是Java的超集吗,Java转C#和C#转Java哪个更容易?

关注者
27
被浏览
34,809

14 个回答

C#最初是参考了Java的优缺点设计的,属于站在前人的肩膀上,而且功能和设计目的也趋同(目标是符合大型商业项目需要的,通用型、跨平台、易用型程序语言)

C#引入的值类型、引用类型是一个很大的创新。解决了长期以来Python、Java等语言默认使用引用类型,导致效率低下的问题。

由于后期C#投入大,进步快,所以慢慢走在了java的前面,一些经典设计比如LINQ、async等,都是很重要的功能,在很多系统中有难以取代的作用。


由于题主的问题是2022年提的,所以说“C#是Java的不严格意义上的超集”没什么问题。

而且从主观感觉上来讲,同样的功能,用C#写比用Java写更舒适、更友好。无论语法设计还是流行的IDE,C#都更成熟一些。

很多答主提到,写惯了Java换C#很轻松,但写惯了C#换Java就比较痛苦。


不过最重要的一点是,Java和C#最大的区别在于软件生态不同。做安卓应用的今天还是得死磕Java,很多大型电商系统也必须得用Java。

换语言就是换技术体系。不可能随程序员高兴,随意切换语言。所以所谓的“Java转C#”或者“C#转Java”是个伪命题,与技术关系不大。

在现实世界中,换开发的语言,总是意味着换项目、换公司,甚至转换行业。

java是C#的前辈,或者说所有有类似中间虚拟机概念的(体系独立不强依赖物理或特定软件环境)语言来看java都是前辈或者说学习参考对象;

至于为什么,因为java是1991年设计出来的,1995年随web兴起发扬光大,那会多数同类语言都还没出生

[顺带一提这也算是经典的先行者案例,因为他最先出现而且基本能满足需求,所以使用者高强度依赖并对环境反哺造成正反馈,之后再因为持续维护等原因自然经久不衰]

C#还是2002年才开始出现的,已经晚了7年,而且官方历史也承认会看起来像java

不过C#出现过阵痛期,从文章里可以看到从1.0->3.0都是C#在追java,但是#在1.0->2.0(2005年)上经历过不兼容级的升级:正式完全支持泛型,但是这也使得两者代码无法无缝进行运行时升降级,但这算是为之后的另一条路打下的基础

不过1.0是2000年,2.0都2005年了,这段时间离java兴起都走了10年,其实这已经开始造成了大量的历史java项目维护需求,并且这段时间还处于web互联网大航海时期,也使得java相关的研究框架文章等内容海量出现并沉淀下来

然后从#4.0之后就正式开始和java走另一条自己的路了,此后的发展就不再阐述.

不过这时候java那边也出现了一点小问题,这个问题和windows一样,他支持跨版本运行时兼容,简单说你拿一份早年的java项目放在现在的新环境上跑大概率也是没问题的,以及新版本的代码在当年的jvm上跑也是多半没问题的(编译器除外,他需要负责翻译对应版本的原始代码到字节码)---就跟windows一样,你在win10上还能跑win2000时代的程序

不过这个代价就是:当年定下的相当多的规则现在依旧要执行,最简单的就是一直被吐槽的"类型擦除",核心原因无他,编译时不擦除,你的代码就不能在低版本jvm上跑---他不认识这玩意,C#解决的方法就是壮士断腕直接宣布不兼容级升级,但是java不行:已经积重难返了,也要这么来一出的话市场开发者也不会认,只能用变通方法类似实现

包括日后的很多内容,只要使用的功能不在当年最初设计jvm时候想到,那就必须在编译时将对应功能翻译成jvm当年设计时能等价的内容的字节码.不过到目前为止大部分新要求他都能做得到转译---不过这也算是为啥他能用到现在的原因

转的话,java转#会舒服很多,反过来的话因为很多时候你要展开简化的语法实现用更质朴的方式去写,你会比较怀疑人生,毕竟人生苦短,早点下班去摸别的事情不更爽.jpg