首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#和Java到底有什么区别?程序员研读4小时后得出了8%的结论

在没有具体看C#的学习文档之前,即使我已经有了八年左右的Java开发经验, 我依然对掌握C#没有多大的信心, 但是在我花了四个小时以直播的方式看完了W3C上,关于C#的介绍文档之后,我发现C#原来是这样子。

先说一下我的结论,单纯从语言自身的角度来讲,C#跟Java的相似程度,我在直播之后给出了一个直觉的92%的估计值, 至于其他方面后面会详谈。

此时有人可能会问,你已经有了八年的Java开发经验,为什么还想着转向C#而不转向当前大火的Rust Python Go等语言呢? 原因很简单,我想写一些windows平台上桌面端的一些小程序,然后顺便学习一下基于unity引擎的游戏开发, 为了同时满足这两方面的需求,C#是不二之选。

言归正传,我先来详细说一下我那个92%的相似值,是如何靠直觉估计出来的。

语法

在C#与Java的语法上, 前者使用的是命名空间的概念,而后者有包的概念,其实这两个概念本质上是相同的, 另外C#在字符的大小写上比较敏感, 而Java在这方面就弱很多, 所以我们可以看到C#的Main方法,它的M是大写的,而Java中的main全都是小写的,除此之外,其他的相同的。

控制台

在控制台的输出上,C#用的是Console类的WriteLine,而Java使用的是System类IO里边的rprintln,除此之外,其他没什么差别, 我这里虽然说的比较具体,但是这里的一一对应关系是十分明显的,所以除了名字不一样,含义与功能是一样的,在这程序员的眼中只是个变量名的差异而已。

注释

在注释的书写方式上,在变量的定义方式以及在变量的初始化等方式上,二者可以说是一模一样的。

数据类型

在内置的数据类型上,二者也是几乎一样的,只不过有些数据类型的名称,有的字母是大写的字母是小写而已,另外一个比较大的差别就是,Java有原生数据类型对应的包装类, 我没看到C#有这样的概念,这是其中的一个小小差别。

类型转换

在基本数据类型的转换上, C#貌似更优雅一些,它不仅可以像Java一样在变量的前面用小括号加上数据类型的方式进行隐式转换之外,还提供了一个专门的Convert类进行显示的转换,这个确实是C#感觉更加的优雅一些。

运算符

在数学运算符、逻辑运算符、比较运算符以及赋值运算符上,C#与Java看起来没有什么不同,只是我听说C#的运算符支持重载而Java的运算符不支持重载,这块W3C上没有介绍,在内置的数学类Math的方法上,C#与Java提供的方法也是大同小异的。

字符串

在常用的字符串类型上,第一个明显的区别,就是一个小小的S字母的大小写的问题,C#是小s开头的string,而Java是大S开头的String,另外C#还专门介绍了一个使用插值法进行字符串连接的操作 其实我觉得其实际意义并不大,因为Java中也有类似于C和C++那种字符串拼接与格式化的相关操作。

条件控制

布尔数据类型这块二者也是一样的,for循环二者也是一样的,Where循环二者也是一样的,do-while循环二者也是一样的,switch语句二也是一样的, 如果非得从鸡蛋里挑骨头找出二者的区别,说实话我真找不到。

数组

在数组的基本操作方面,Java和C#也没有明显的区别,不过我在别的地方看到的一句话,说是C#中,数组是对象的直接规格化,而Java中数组则是系统的规格化,说实话我不明白是什么意思,后续在实际用的时候在做详细研究吧。

了解了这些基本东西之后,你能具体找到二者之间的多少区别呢,说实话区别应该没有5%吧。

面向对象

W3C在后续介绍面向对象的概念,继承的概念,多态的概念,访问权限控制的时候, 二者可以说是一模一样,因为这些概念并不是属于某一种语言的,而是一种共通的理念, 但是如果非要找出来几点不同,我现在记得有3点:

第一个是在访问权限控制这块,C#除了有public protected privite之外,还多了一种叫做internal的控制权限, 至于这个访问权限能控制到什么精细程度,只有到实际开发的时候才能体会得到。

第二点就是在抽象类这一块儿以及方法的重载这一块儿,C#沿袭了C++中的virtual关键字用于表示这个方法是一个虚方法, 而且当基类和子类有同名方法的时候, 如果选择用基类的对象来调用这个方法,C#的选择是,基类的方法会覆盖掉子类的方法,而Java中则是子类的方法会覆盖基类的方法,这是一个明显的区别。

第三,在继承与接口这块儿,二者是相同的,都只允许单继承多实现,4个小时之后,我记忆最深刻的是,在C#中,value这个词,竟然是一个关键字,因为C#相较于Java多了一个属性的概念,这个属性说白了,其实就是Java中get/set方法的一个不同形式的实现方式而已。

得出结论

到这应该差不多了吧,如果单从语言的本身上来讲,二者的差别微乎其微, 在5%的基础之上,再扩展3%的一个误差,二者在单纯语言上的差别,也就8%左右。 这里大家一定要看清楚,我说的是以单纯语言这个比较角度。

核心困难点

但是在四个小时的转换学习之后,你真的能够从Java快速切换到C#进行生产级的开发吗?这绝对是不可能的,因为你仔细想一想,你用Java开发的时候,你用Java语言本身的东西有多少?你估计80%用的都是框架提供的东西,而框架正是Java的灵魂之所在!

所以如果想从Java正式切换到C#,那么就不得不做一件事情,那就是梳理出自己在Java中常用的一些框架, 然后再去C#中找到与之映射与匹配的框架,然后再去这些框架中搜寻那些常用的API, 而这些API的记忆与描述文档的阅读,至少得花大约100个小时的时间。

至于什么跨平台什么性能这些差距,这玩意儿根本就不是普通程序员应该考虑的问题, 因为你当前入职的公司就已经有了明确的选择,而这个选择的依据,就是这个公司的存量代码。

杰哥是干啥的?

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230126A02DTY00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券