最近由于项目变动,需要用.NET/C#做开发,经过一段时间的学习和培训,对这个技术栈有了一定的理解。大家可能都知道Java和.NET/C#很像,这里粗略的把两者做一个对比,希望对感兴趣的童鞋有所帮助。
如果现在有人问我:.NET/C#怎么样啊?我的回答会是:用.NET/C#做开发,上手确实快,很适合小项目开发;但是生态远不如Java,所以这也是它流行度不如Java的原因。(TIOBE Index for October 2019)
首先,解释一下.NET Framework和.NET Core的区别:.NET Framework是老一代的.NET平台,只能运行在Windows机器上,所以严格来讲,.NET Framework并不是完全的跨平台;.NET Core是新一代的.NET平台,2016年才推出,能够实现真正的跨平台,可以运行在Windows、Linux、Mac OS等机器上,这就和Java一致了。微软的计划是在.NET 5统一这两个平台,意思之后只会有一个统一的平台,就叫.NET。
关于.NET体系中各个平台的关系,可以参考下图(https://devblogs.microsoft.com/cesardelatorre/net-core-1-0-net-framework-xamarin-the-whatand-when-to-use-it/):
上图除了.NET Framework和.NET Core之外,还提到一个Xamarin,它是专门用于开发移动端应用的平台。这又让我联想到了Java,起初Java也分成了三个平台:J2ME、J2SE、J2EE,感觉Xamarin有点对标J2ME,主要focus在移动端开发,.NET Core对标J2SE,而ASP.NET Core就是对标J2EE。
Java和.NET的比较
下面是我整理的Java和.NET的比较列表,可以看到它们确实很像,基本上很多概念都可以对应起来。
之前在微软官网浏览介绍ASP.NET的页面时,看到.NET的性能比Java Servlet高出很多,居然高出两倍还多,让我很是惊讶。(具体参考https://dotnet.microsoft.com/learn/aspnet/what-is-aspnet-core)
另外,关于.NET Framework版本的进化历史,可以从下图粗略了解到:
出处:https://www.geeksforgeeks.org/c-sharp-net-framework-basic-architecture-component-stack/
Java和C#语法比较
C#的语法由ECMA334定义(https://www.ecma-international.org/publications/standards/Ecma-334.htm),而Java的语法是由Java Languge Specification定义(https://docs.oracle.com/javase/specs/)。
一点题外话,关于ECMA,我们耳熟能详的可能就是ECMAScript,即是javascript的超集,ECMAScript是由ECMA262定义。ECMA其实是一个标准组织,我们听得比较多的另一个标准组织就是ISO(国际标准组织),记得之前做过一个task,就用到了ISO关于日期格式定义的一个标准ISO 8601。在我之前关于编码的一篇文章(关于编码的那些事),也有提到一些关于编码的ISO标准,比如ISO-8859-1。
关于Java和C#两个语言语法的比较,这里推荐一个网址(http://www.javacamp.org/javavscsharp/),里面有非常详细的对比:
除上面列出的之外,我想再额外补充下面一点:
Extension methods(扩展方法):扩展方法是C#的概念,主要是用在一个类提供的标准方法满足不了需求的时候,可以扩展 这个类,提供一些额外的方法以实现自定义的功能;Java里面没有这样的概念,如果要实现这样的需求,只能通过继承或者组合来实现。这里提到继承,在Java里,继承的关键字是extend,而extend的关键字就是扩展的意思,这可能就是Java语言设计者的本意吧,通过继承来实现一些扩展的功能。其实extension这是一个很大的话题,不光在语言本身层面需要考虑,在应用层面,其实也常常需要考虑,比如说字段的扩展、流程的扩展等。这里的扩展方法,则可能更多的像是一种流程的扩展。
References
http://www.javacamp.org/javavscsharp/
.NET/C#在性能测试中表现很不错:https://www.osnews.com/story/5602/nine-language-performance-round-up-benchmarking-math-file-io/