C# 14 重磅发布!5 个让代码更简洁的新特性

文 | McCoy Zhang

写在前面

去年 11 月,.NET 10 正式发布,随之而来的 C# 14 带来了一系列让人眼前一亮的新特性。

作为一个写了 10 年 C# 的老兵,我第一时间体验了这些新功能。平心而论,C# 14 这次的更新非常接地气——不是那种花里胡哨的炫技功能,而是实实在在能提升开发体验的改进。

今天这篇文章,我用最通俗的方式,带你快速掌握 C# 14 最实用的 5 个新特性。


1️⃣ 文件级应用:终于可以甩开项目文件了!

以前的痛

在 C# 14 之前,如果你想运行一个简单的 C# 文件测个代码,需要经历以下步骤:

  1. 创建一个解决方案(.sln)
  2. 创建一个项目文件(.csproj)
  3. 写几行代码
  4. dotnet run

就为了验证一个简单的想法,光项目文件就要写一大堆配置。

C# 14 的解决方案

现在有了 文件级应用(File-based Apps),一切都变得简单了。

创建一个 Demo.cs 文件:

Console.WriteLine("Hello, C# 14!");
DateTime today = DateTime.UtcNow.Date;
Console.WriteLine($"今天是: {today:d}");

然后直接在命令行运行:

dotnet run Demo.cs

就这么简单! 再也不用创建项目文件了。

💡 小贴士:你甚至可以在文件顶部加 #r "nuget:PackageName" 来引用 NuGet 包,同样不需要项目文件。


2️⃣ 扩展成员:写扩展方法更优雅了

什么是扩展方法?

扩展方法允许你为现有类型添加新方法,而无需修改原代码或创建子类。最典型的例子就是 LINQ 的 WhereSelect 等方法。

以前的写法

在 C# 14 之前,写扩展方法必须这样:

public static bool ContainsAnyDigit(this string value)
{
    if (string.IsNullOrEmpty(value))
        return false;
    return value.Any(char.IsDigit);
}

注意那个 this 关键字,每次写都很烦躁。

C# 14 的新写法

现在有了 扩展块(Extension Blocks),语法更清晰:

extension(string value)
{
    public bool ContainsAnyDigit()
    {
        return !string.IsNullOrEmpty(value) && value.Any(char.IsDigit);
    }
}

对比一下,哪个更清晰?显然是新的扩展块语法!

扩展成员的优势

  1. 语法更简洁:不用每次都写 this 参数
  2. 代码更清晰:receivers 和参数一目了然
  3. 支持扩展属性:以前只能扩展方法,现在连属性也能扩展

3️⃣ nameof 对泛型的改进:终于不用写虚假类型了

以前的困扰

假设你想获取泛型类型 List 的名字,在 C# 14 之前必须这样写:

string name = nameof(List<int>);  // 必须指定类型参数

这就很尴尬——我只是想获取类型名称,凭什么要逼我填一个类型参数?

C# 14 的改进

现在支持未绑定泛型(Unbound Generics)

// C# 14 新写法
string name1 = nameof(List<>);
string name2 = nameof(Dictionary<,>);

Console.WriteLine(name1);  // 输出: List
Console.WriteLine(name2);  // 输出: Dictionary

太爽了! 再也不用写那些只是为了占位的类型参数。


4️⃣ 复合赋值运算符重载:让自定义类型也能用 +=

业务场景

假设你在写一个购物车类,希望支持 += 运算符来添加商品:

ShoppingCart cart = new ShoppingCart();
cart += 5;    // 添加 5 件商品
cart += 99.9m;

C# 14 的支持

C# 14 现在支持自定义复合赋值运算符:

public class ShoppingCart
{
    public int TotalQuantity { get; private set; } = 0;
    public decimal TotalAmount { get; private set; } = 0m;
    
    public static ShoppingCart operator +=(ShoppingCart cart, int quantity)
    {
        cart.TotalQuantity += quantity;
        return cart;
    }
    
    public static ShoppingCart operator +=(ShoppingCart cart, decimal amount)
    {
        cart.TotalAmount += amount;
        return cart;
    }
}

支持的运算符

C# 14 支持自定义:+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=


5️⃣ 如何在项目中启用 C# 14

环境要求

  • .NET 10 SDK 或更高版本
  • Visual Studio 2026 或更新版本

项目配置

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <LangVersion>preview</LangVersion>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

关键点:LangVersion 设为 previewTargetFramework 设为 net10.0


总结

C# 14 这次更新非常实用:

特性 推荐指数
文件级应用 ⭐⭐⭐⭐⭐
扩展成员 ⭐⭐⭐⭐⭐
nameof 泛型 ⭐⭐⭐⭐
复合赋值运算符 ⭐⭐⭐⭐

💡 关注我,获取更多 C# 实用技巧!