截至 .NET 6, C# 在后端开发领域的生态与 Java 还有哪些差距?

2022-04-07 17:10:55 +08:00
 wdhwg001

如题,这里的“生态差距”不包括岗位、薪酬、求职与招工难度等人力资源生态问题。

就我个人感觉来说,C# 在语法上确实要香的多,性能更好,而且 VM 也远不需要 Java 的那些黑魔法。

但是,总有人说 C# 的生态很不好,想知道到底二者之间有哪些差距?有哪些库或中间件是 Java 特供而 C# 没有或发展极不完善的呢?对于实际的后端开发会有多少影响?

以及,也常听说全球范围内的 C# 生态好一些,那么如果忽视掉这些 Java 非全球范围的大厂自研开源和中文社区特供的部分的话,C# 和 Java 在后端领域的差距又有多少呢?

( PS:这里讨论的 C# 特指 .NET 6, 不讨论 Mono 、.NET Framework 以及各 AOT ,也不讨论 IIS 及早已不存在了的 Windows/Linux 平台问题。)

8514 次点击
所在节点    程序员
83 条回复
INCerry
2022-04-08 09:46:31 +08:00
@Osk 嗯嗯 从现在来说你说到的跨平台运行 和 打包包括运行时功能都支持了
MonoLogueChi
2022-04-08 09:46:35 +08:00
.net 6 ,生态不行,太新了,现在很多库都没跟上,不支持.net 6 。不说 .net 6 ,说整个语言的生态,也太难搞了,自己开发产品可以,但是需要用到第三方 sdk 的话,基本都要自己维护,举个简单的例子,我们公司一项服务用到了某云的产品,但是 sdk 只提供 .net core 2.1 的,更高版本的只能自己维护,而且某云风评还不太好,业务说改就改,自己维护这东西就是个炸弹,指不定啥时候就炸了。
INCerry
2022-04-08 09:52:22 +08:00
@ivyliner
我很多同事就是使用的 macOS 开发.NET 程序,之前还有使用 Ubuntu 的
ccppgo
2022-04-08 09:53:28 +08:00
@INCerry 你这句话反过来理解就是,java 薪资不用给够也能招人很快, 还给老板省成本了, 难怪都不用 c#
sinnosong1
2022-04-08 09:54:52 +08:00
@ivyliner “作为一个非后端开发人员不知道在 macOS 上是否可以开发并运行 .NET, 但是我知道 Java 可以. ” 不知道该怎么吐槽了,vs for mac 都多久了。建议开滴滴,这行不适合你。
zxxufo008
2022-04-08 10:06:02 +08:00
@hbing #33 hello world 一个有熟悉的开发语言的人能搞 5 、6 天,确定不是自己的问题?
Narcissu5
2022-04-08 10:17:33 +08:00
CLR 及 C#确实很多特性不错,但这些不错很多是通过激烈的变革得来的。后果就是这么些年下来除了微软的一方库.net 几乎没有什么积累。Java 在引入特性上非常保守,结果就是很多十年前的代码还能跑。说实话在字节码虚拟机这个生态位上已经没有谁可以挑战 Java 了。.net 要想超车得有新东西,类似 Go 那样的
fengjianxinghun
2022-04-08 10:28:20 +08:00
@sinnosong1 你自己了解过么? vs for mac 就是以前的 monodev 改了个名,和 win 上的 vs 完全是 2 个东西
sinnosong1
2022-04-08 10:32:55 +08:00
@fengjianxinghun 你能不能注意下这个人说的是什么????????????????????????????????????????????????????????????????????????????????????????????
他说:“不知道在 macOS 上是否可以开发并运行 .NET”
“monodev 改了个名,和 win 上的 vs 完全是 2 个东西”跟“不知道在 macOS 上是否可以开发并运行 .NET”有关系么?
sinnosong1
2022-04-08 10:34:25 +08:00
@fengjianxinghun 改名不改名有任何关系吗?这个人说的是不能开发并运行。请问不能开发并运行吗?
vone
2022-04-08 10:37:12 +08:00
https://dotnet.microsoft.com/en-us/download/dotnet
https://docs.microsoft.com/zh-cn/aspnet/core/migration/31-to-60?view=aspnetcore-6.0&tabs=visual-studio

最大的问题在于.NET 已经再次出现了生态的割裂(.NET 2.1 、.NET 3.1 、.NET 5.0 、.NET 6.0 、.NET 7.0 ),即使是 LTS 版本也只支持 3 年。
vone
2022-04-08 10:40:34 +08:00
Mithril
2022-04-08 10:52:57 +08:00
基本还是看你做什么项目。
微服务框架和各种周边库不是很全,虽说你可以用 HTTP ,但用起来也不是很方便。
一些稀奇古怪的库也很少,有可能有些用的人少的功能你就得自己做。特别是国内环境中你要对接第三方服务大概率是有 Java 的 SDK ,没有你也可以随便 Github 搜个个人作品,但 C#的就很少。

具体会不会影响开发就看你自己情况了。我们对于引入第三方库非常严格,需要评价 license ,质量,可维护性,必要性等等一堆东西。基本上不会随随便便就抄段代码拉个库进来。所以缺少这些东西影响也不大。而且产品没有阿里腾讯那种用户规模,也用不着上全套微服务框架。所以写起来开心的 C#就很合适。

总而言之技术选型还是要看公司具体情况,不是哪个公司都是大厂,适合他们的未必适合你。其它那些压根就没在项目里用过 C#的评论基本就不用看了。
INCerry
2022-04-08 11:35:27 +08:00
@ccppgo 我说的薪资是对应语言薪资上浮,不是说整个整体,其实我不想说的那么具体,就是很多人还想用以前传统行业工资水平招 C# 开发,不愿意把工资涨上来对标到 Java ,再说 Java 资源占用大,C# 更能省服务器资源
Mirage09
2022-04-08 11:38:21 +08:00
为啥老有人说 c#在国内用的少,国外用的多…
欧洲不知道,美国招 c#的要么微软,要么传统公司,能有多少岗位…
INCerry
2022-04-08 11:40:31 +08:00
@vone .NET Core 以后生态没有发生割裂(.NET Fx -> .NET Core 发生了割裂),此外这些都是正常的版本升级,没有啥问题,固步自封不跟随时代改进那才是最大的问题。另外 LTS 版本业内基本都是 3 年支持,你不需要新的特性那就不需要升级,你看 Java8 早就停止支持了,还是有很多人用。
另外.NET 从.NET Core 3.1 开始,中断性变更已经很少了,框架基本已经稳定,从.NET Core3.1 迁移到.NET6 基本只需要修改版本号。
klo424
2022-04-08 13:59:32 +08:00
@INCerry #56 对头,我也想说,被你抢先了。能说出生态割裂的观点,基本是没用过.NET CORE 的。
thinkershare
2022-04-08 14:11:57 +08:00
@INCerry 和一堆不用.NET 的解释, 完全是浪费时间! 我各个语言都用, 除了廉价的靠谱劳力没有 Java 多, 我没发现有啥缺点! 微软自己总是作死, 这点谁也没有办法. 如果要我说, 我觉得生态从.NET 1.0 到.NET Framework 4.8 再到现在.NET 7 就没有什么大的变化, 也不存在中断, 唯一问题是微软换了太多次 UI 库了(包含 Web 层面), 这个导致很多做 APP 开发的人跑掉了, 另外微软在 Mobile 上的败局导致了今天的局面, 和 Java 的竞争失败纯粹是微软自己的策略问题, 出来比 Java 晚, 开源太晚, 人家已经有现成的方案, 为什么要花费巨大的成本更换呢? 另外就是失去了话语权, 这点其实很致命, 是微软 90 年代自己结了太多怨了. 不过大部分人都是白嫖党, 在免费和没有更好的选择下, 你看还不是乖乖选择了 VSCode, TypeScript 这种微软出的东西.
thinkershare
2022-04-08 14:13:01 +08:00
@klo424 UI 库方面, 微软从 Windows 8 开始, 折腾的是比较离谱, 特别是 Windows Phone 的败局, 得罪了很多开发者.
FrankHB
2022-04-08 14:57:58 +08:00
大量廉价可替换的劳动力。

技术理由不是没有,而是多到罄竹难书,但都算是细节,相比起来算是次要的。
真要说就有一个有代表性的:因为 project leader 水平问题,经常半吊子,完全无法一步到位,发版就是打补丁还不是 Java 那种用户自下而上推的那种,搞得底层生态发展自上而下地得半死不活。
比如 C# 2~4 ,先搞什么 anonymous method 再加 lambda 。你要是上道点,直接加 lambda 会死?特别是要知道历史上本来就先有的 lambda ,哪来你 method 什么事(当然严格来说你抄 Java 就注定是败笔了;类似的问题还有到处 method 不给 free function 再用 extension method 之类擦屁股等等,细想起来到处都是)。
虽然多加一个特性表面上就是多给了个选择,但是这类玩意儿根本是自上而下牵一发而动全身的,只有从上游推广,(因为传统的静态语言的先天问题)用户自己除非有本事整个重新实现一遍(也就有本事整出半吊子,比如 Mono )都没法 derive (不像 JS 起码有自举的 Babel 这类; dynamic 这种补丁就算了),结果就是用户不得不被迫浪费精力了解这种半吊子设计,要么跳车要么就习惯基础技术时刻落伍。
要命的是这种微创新累积问题不是一个两个,官方还成习惯了,丝毫就没表现出要怎么克服改进。
而各种兼容性问题(像 @vone 提的)则是这种问题的一类表面上的体现。其实这种症状要只出现个例也还不是问题,但是多了工程上就很劝退了。

你要是 Java ,这还真不是太大的问题——本来 Java 用户平均来讲就是工业界里最容易在这方面被糊弄的又有强大的钉子户传统,最不怕的就是语言层次上的一成不变,嫌没事干可以头铁手动日 CheckedException 或者人肉翻译 XML 到 stacktrace 玩儿然后强行算成 framework 类似物的 KPI ,大多数用户都会默默接受习以为常;但.NET 除了软粉以外很多也就是从被 Java 糊弄不爽的状况下叛逃过去的,用户基数一开始就是问题,还玩碎片化?(还有大明湖畔的.NET CF……)岂不是才离虎口又入狼窝?
而且这么多年了微软阵营的开发者应该都知道上游对坚持技术方向的软弱性和自己选择跟微软走的沉没成本。看这堆特性刷版本号的敏捷套路玩多了,越来越多的 Java 开发者即便不满,也都不愿意上车了。
要知道大多数开发者其实日常是摸不到 JVM/CLR 之类垃圾在哪的,所以深刻体会到 Java 的烂以后,这年头 Java 开发者流行跳其它 JVM 语言,转型失败风险小反复横跳难度低,哪像你.NET 看起来那么 49 年入国军的?

别的用户转.NET 么,生态位问题,不会是主流路径。毕竟历史上你.NET 的中坚力量 C#造出来先天就是怼 Java 的(.NET 本质是召唤 COM 加成,只要接受微软全家桶能受得了 0x800 稀里哗啦的 HRESULT ,不用白不用),所以吃不死 Java 用户,也没什么盼头了。
别的比如搞 C++的,因为嫌弃语言用起来麻烦跳 Rust 之类还算正常,但跳.NET 的理由基本只会是被迫写 UI 然后还只需要应付 Windows ,而不是说 C#之类真比 C++用起来舒服到哪去了(光一个 using 的缩进就够欠扁了)。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/845526

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX