杨柳657
发表于 2021-2-9 06:34
从语法角度来说java逊色c#太多,而且现在从性能角度也是完败的span<>类型,java还没有
音乐之家1
发表于 2021-2-9 06:35
我的个人体会是C#允许你做很多事情,实际做的好不好由我决定:
int a = 1;
var b = 1;
dynamic c = 1;
int* p = &a;
Int32 d = 1;
int? f = 1;
using uint8_t = System.Byte;
uint8_t g = 1;
上面那个赋值语句是最好最符合“范式”的呢?C#告诉我的答案是:在你了解你付出的带价和你的回报的基础上,取你喜欢的就行。
C#给我的感觉是无尽的可能性,在忽略效率的前提下相当多的编程风格都被允许,在忽略编程风格的前提下,相当多级别的抽象被支持。我是写C语言的电子生出身,C#从与Native库的沟通,甚至直接执行机器语言都被很好的支持,能满足我对性能的无尽追求;同时我也些网站调一些库,这些库所使用的风格多种多样,有些允许你用不同编程风格操作同一种东西;再加之C#自带库中即便对同一种东西都有多种不同抽象级别的抽象,当我想快速5分钟内就要立刻吃成胖子时也有门路、想花几天摸索内部原理写个通用的好的代码也有的是底层东西可以调用。
最后,配合宇宙最强IDE——VS,写C#时我是真心感到是一种享受,一种我自己在支配代码的感觉,想规范就规范,想跳步骤也有各种乱来的办法。当然C#也有缺点,我也写很多其他代码,比如我的网站是用PHP写的,我参与的游戏脚本全是lua他们的优点也很多时候让我获益,但综合权衡后C#不曾被任何一门我写过的语言超越过,一定要说的话也只有在嵌入式开发时使用C/C++时的自由能与之匹敌了,但只比较语法的话C++的一些新标准虽然也有很大的自由性但C#给我的感觉更加优美,况且它们服务于不同的层次,如果可以我也想让STM32跑C#呀,但性能实在不够呀~(跑个micro Framework虽然行但太鸡肋适合外行人)
我不是重度软件从业者,但自己臆想下,反而是因为C#的可能性过大反而不利于满足当今尤其是面向应用层的软件行业希望奴役一批不需要多少创新能力的码农来做重复劳动的需求。我JAVA写的不多,但从别处查找到说有人曾提出在java 中加入类似var的功能却被驳回,加之我写的为数不多的java和安卓项目中好多库的调用风格都很类似让我觉得这更适合机械重复的生产劳动场合吧?(纯属外行人见解,欢迎指正)
井底燕雀傥
发表于 2021-2-9 06:36
首先说Unity,Unity的C#并不是传统.Net开发的C#,它的编译方式是通过IL生成码进行转换,转成Native C++ code(IL2CPP),满足跨平台需求,即使是编辑器内使用的Mono虚拟机,论“先进”也绝对不是JVM的对手,性能被JVM甩三倍都不奇怪,另外Unity在编译阶段还有一个Burst Compiler,能够编译并深度优化代码,据说处理并行逻辑可以达到超越C++的性能,但是缺陷是Burst Compiler只能接受非托管的纯数据类型,所以使用Burst Compiler编译的程序连基本的OOP都很难做到,可以说就是披着C#外壳的C语言,比如Unity2018的Job System:
当然,这里的Interface也和真正意义上的OOP中装箱拆箱的那个Interface也没半毛钱关系了,纯粹就是为了编写方便和编译方便做了个标记而已……
所以说到C#硬要扯Unity着实显得有些牵强附会,至于语法层面和Java的比较,我觉得Java因为没有运算符重载,没有属性等特点导致十分啰嗦这倒是不算一个大问题,最多算是语法皮毛的问题,在我看来Java最严重的问题在于缺乏有效的内存管理方法,比如只有堆数据类型class,那么我开一个object[]实际上相当于开了一个存储着内存地址指针的数组,而不是类型本身的数组,抛开GC带来的困扰以外,许多深度优化方法也会碍手碍脚,比方说我这里有一个4x4的矩阵,如果需要做SIMD计算优化,在C++或C#中我可以将这个矩阵假设为一个大小为16 * sizeof(float)的数组,因为两者在空间占用上是完全一样的所以不会导致undefined behavior,再比如我要把一个数组内的元素按照统一的stride和length传入到另一个设备的内存中,比如GPU,如果是C++或C#可以直接用地址做Memcpy,因为C#中struct本身就是值类型,而Java因为层层封装所以想做到这种精确的内存控制是非常困难的,所以在性能上限上就会受很大限制。
以上是客观方面的差距,主观方面在于本人十分不喜欢现在的面向对象的设计模式,大多数面向对象的设计模式死板,僵硬,难以做可视化抽象,解耦困难,并且对硬件不友好(内存不连续碎片化严重,访问方式对缓存不友好,难以做并行处理等),因此厌屋及乌,对于Java这套纯粹为了OOP而发明的语言也是很难说的上喜欢。
唰唰冷呵映
发表于 2021-2-9 06:38
The Ubuntu Open Source Project on Open Hub 一个小统计.
杨柳657
发表于 2021-2-9 06:45
具体说不出优秀在哪里,反正写着爽多了。
十二音阶囤
发表于 2021-2-9 06:45
我之前一直在用C#, 最近刚刚开始用Java, 还是有很多不习惯,列出来跟大家一起讨论,有些不准确也请见谅。 需要说明的是,这里列出来我觉得Java不如C#的地方,我对Java并不熟悉,同样C#也有很多不足的地方。
整体而言,我觉得Java用起来不如C#方便,好用,但是确实Library/例子很多。C#最大的问题就是微软一家独大,而且没啥好的Open Source的资源,例子少,所以,虽然语言好用,但是开发效率可能并不高。一下是我遇到的一些用Java不爽的地方:
1) Property
C#中可以直接 public string Name { get; private set; }来定义一个property, 而Java还在用getName(), setName(), 同样功能代码要多不少,而且get/set也没有直接用property直观。
2) LINQ
LINQ虽然用的不好会有性能问题,但是在绝大多数情况,用起来能极大的缩短代码量,可读性也很好。Scala在Java之上增加了各种处理collection的API像fold, map, flatMap等等,不知道Java是不是有可能提供这些(或者已经提供了?)
3) File/Class name, Folder Structure
Java中class name必须跟file name对应起来,folder structure必须跟package的名字对应。虽然这使得代码结构更清晰,但是我觉得这个更适合于大工程,如果我只是个小程序,按照规则,我的package是com.companyname.project, 那我就得建3层目录,搞得太死板,用起来很不方便。相对而言,C#要灵活很多,你可以在一个文件里放多个class, 也可以让不同目录下的类属于同一个namespace。如果你真的想要这个功能,也可以通过Stylecop来实现。另外,可能有同学说这样比较容易找类,这个我同意,但是现代IDE已经把这个查找功能做的超级方便了,即使没有这个格式,也可以很容易找到。
4) Async/await
写过server端程序的人都知道,调试异步程序是非常非常痛苦的一件事,C#通过Async/await极大解决了这个痛苦,Java9希望能提供类似的功能。
5) Extension Method
C#可以给已有的类增加Extension Method, 它可以增加程序的可读性,让程序看起来更简洁,我个人觉得非常好用。
6) Method Parameter&#39;s default Value
Java不支持Method Parameters给default value, 推荐定义多个同名方法来实现这个功能。虽然效果一样,但是用Java要比C#多写好多行代码,感觉很不方便。
7) Tuple<T>
有时候写method返回值得时候,可能会希望返回2个值,而又不想再单独定义一个class的时候,Tuple就显得非常好用了。虽然自己可以很简单的实现Tuple, 但是Java如果像C#那样提供这个实现就更好了。
8) Nullable<T>
Scala用Option来提供了类似的概念,感觉Java也应该提供这样一个东西。
9) Checked/Unchecked Exception
Java把Exception分成Checked/Unchecked,感觉本身把这个问题复杂化了。按它的说法,可恢复的情况用checked exception,而不可恢复的情况用unchecked exception,但绝大多数情况,无论可不可恢复,你都需要gracefully shutdown或者恢复。别的语言很少有这样设计的,我个人觉得这个设计把简单的东西变麻烦了,结果大家以后可能就按最简单的Unchecked exception做了:-)
10) Class Initializer
在C#中,如果我要Initialize class中的properties的时候,我可以很容易用大括号来initialize, 但是Java中似乎没有这样的支持.
var c = new MyClass() {
Width = 10,
Height = 15
};
我心如烟卸
发表于 2021-2-9 06:53
比较这两门语言的语法,是不能脱离版本去比较的。用新版的Java,对比老版的C#,则几乎是同一门语言。
C#的语法优秀之处,在于它一直牵着Java的鼻子走,这一点点差距,Java却始终都追不上。继续追吧?越追自己越像个山寨货。不追吧?差距就越拉越大。
早期的C#只比Java多三个东西,分别是委托,事件,引用传值。这三个东西在Java圈曾经展开过一番争论,但当时Java圈儿的主流意见是,“这三个东西没什么用”。所以Java一开始并没有追C#。
后来发生的事情大家都知道,尽管Java追的很含蓄,但终归还是追了。对于Java来说,做出这个决定应该是很艰难的,否则也就不用搞得扭扭捏捏的,耽误了好几年,还美其名曰“代理”。就像女人的贞操一样,第一次总是要假装很抗拒。但只要有了第一次,就一定会有第二次,第三次。。。。。
当Java初尝禁果之后,刚刚把委托这个“新玩意儿”告诉粉丝们不久,C#却又搞出了另一个新玩意儿——泛型。尽管粉丝们立刻又得出了“泛型真没什么用”的结论。但不久之后,Java还是第二次偷吃了禁果。这次就放开很多了,至少没有再耽误好几年。
第三次,Java就变得毫不避讳了,C#仅用两个小东西,就让Java爬上了C#的床——集合与字典。当然,同样“没什么用”。
此后,尽管粉丝们一次又一次重复“没什么用”,但Java就像个荡妇一样一发不可收拾。先后加入了“没什么用”的异步,( )=>{ },Task,await。。。。。。
你会不会觉得,JS里面好像也加入了这些。也是抄C#嘛?没错。但跟Java情况不同的是,JS和C#是合法夫妻。很多人只知道C#是微软的,却很少有人知道,它同时也是ECMA语言,是由ECMA组织和微软共同维护的。所以JS抄了,但抄的理直气壮,可Java跟ECMA实在没有半点关系。。。。。
你知道Java下一次要加入的“没什么用”的是啥玩意嘛?或许是“异步流”?或许是“Records”?或许是两个全要?。。。。总之,等Java再更新一两个版本,你就会见到它们了。
123456823
发表于 2021-2-9 07:00
C#有泛型 Java没有
(别和我说Java那基于类型擦除的语法糖是泛型)
C#同时支持value type(Struct) 和 ref type(Class)
Java除了基础类型是value type 无法自定义其它value type
(吐槽一句 不考虑效率的话 Java真的想做纯OOP 索性就不提供value type的基础类型 以提高纯度 现在是二不像 -> 自作聪明的人不要对我说 Java有基础类型包装类 如果你完全保证只用Integer 而不用int 不就能保证纯OOP了么 非也 Java无论如何做不到纯OOP 除非Java可以像C++11一样 自定义字面常量 因为 当你写下 1的时候 得到的永远是一个 int 的字面常量 而非一个Integer的字面常量 一点也不纯 所谓纯净 你必须能写出 1.toString())
C#有自动类型推导
(不过毕竟Java没有泛型...没有自动类型推导似乎影响也不大...)
C#能重载操作符
Java写的数学库简直蛋疼
还有很多很多 想到再写........
总之C#在语言特性上绝对爆Java十条街
缺点 就是毕竟微软自家的东西
就算有mono 但是除了windows上
其他地方我还真不敢用
不过绝对是windows应用的首选语言
dxf17
发表于 2021-2-9 07:07
C#的语言的优雅特性,比如泛型,动态类型dynamic,函数式编程lambda,linq,扩展方法,委托,异步编程async/await 等等 java是望尘莫及(即便java8稍微有点起色但还是差距太大),其他的各种优雅的语法糖就不说了。我从C#转java感觉就是做惯了飞机突然让骑自行车的感觉,如果微软一开始就奉行java的开放策略,估计现在java早就被人遗忘了,然并卵,现在的结果是java的生态和开源环境是王道,再加上微软移动端的失利,C#眼见是会越来越没落,只是可惜那了优雅的语法,简洁的代码。
123456865
发表于 2021-2-9 07:13
从.NET1.0一直用到前两年,后为因为一些项目项目需要用到一些工源软件,这些软件只有Java版本,就用了一段时间Java,当时旧系统用到的是 Java 1.7。习惯了C#中Lambda用得溜,突然发现Java竟然没有Lambda表达式,当时就给跪了。没这特性,我得多写多少代码呀。
幸好Java1.8开始就跟进引入Lambda 了,要不然真的苦逼。老实说,只谈语言易用性上,Java是经不上C# 的。