十年C#老兵吐槽:命名混乱、版本爆炸、语法膨胀…但我依然爱它

作者:微信公众号:【架构师老卢】
6-7 9:16
7

C# 这门语言养了我整整十年。

大学时我学的是 Java。从 C/C++ 转过来简直是一种解脱——终于不用再面对该死的指针了。

第一份工作被迫学 C#。我写的第一个程序根本是 "披着C#外衣的Java代码"(毕竟当时我只会Java)。

我热爱 C# 和整个 .NET 生态:强类型、多范式、工具链完善、官方支持稳定。但是…

以下这些事真的让我抓狂:


1. 命名玄学

计算机科学有两大难题:缓存失效和命名——而微软的命名策略简直是灾难现场。

一边是把 ".NET Core" 改名为 ".NET",现在所有东西都叫 .NET。是营销策略吗?鬼知道。

另一边是目标框架名称(.csproj 文件里的版本号)。曾经我们有 .netcoreapp1.X、.netcoreapp2.X、.netcoreapp3.X,突然某天变成了 .net5.0。

我脑补过微软 Teams 里的对话:

"咱们把版本号也改了吧,直接用.net加数字"
"不行!.net4 会跟 .NET Framework 4.0 冲突"
"那…直接跳到.net5?"
微软的命名部应该被发射到火星!


2. 版本洪灾

生态持续进化是好事,但…

以前我会逐字阅读每个版本的更新说明,现在?只关心LTS长期支持版。那些短期版本里"某某架构性能提升3%"的改动?抱歉,根本懒得看。

版本迭代太快反而让人疲于跟进。


3. 语法肥胖症

现在的 C# 像三个语言的缝合怪:

  • 2010年前的古早版本
  • 2010年左右的经典版本
  • 现在的"瑞士军刀"版本

我曾经追每个新特性,现在放弃了。语言一致性正在崩塌——光是创建和初始化对象就有 N 种方式。

除了可空引用、模式匹配等少数功能,大部分新特性都是语法糖( discriminated unions 还要等到 C# 20 吗?)。最可怕的是看起来相似但行为迥异的特性,比如:

// 记录类型(自动生成公共属性)
public record ThisIsARecord(string ThisIsAPublicProperty);

// 主构造函数类(不会生成公共属性!)
public class ThisIsAClassUsingPrimaryConstructor(string ThisIsNotAPublicProperty)
{
}

这种不一致性让教学和学习成本陡增


4. AutoMapper 暴政

AutoMapper 本身没问题,但把它当作事实标准的对象映射库就是个悲剧——80%的时候它都在帮倒忙

连作者都建议:"如果手动映射超过80%字段,就别用我"。但我们还是滥用它。最近两周我就遇到两个坑:

"AutoMapper,我知道自己在做什么,让我手动处理不行吗?"
——然后发现自己在对抗它的校验规则

本来还想吐槽 EntityFramework Core,但写着写着胃开始疼了…可能只是饿了吧。


结语

尽管有这些槽点,.NET 依然是我的首选平台,C# 仍是主力语言。

你呢?最想吐槽 C#/.NET 的什么?

(代码块保留原始C#语法高亮,关键术语加粗,吐槽部分使用emoji增强语气)

相关留言评论
昵称:
邮箱:
阅读排行