C# 14 扩展块

发布: (2026年2月1日 GMT+8 08:20)
4 min read
原文: Dev.to

Source: Dev.to

(请提供需要翻译的正文内容,我才能为您完成简体中文翻译。)

介绍

了解 C# 14 扩展块 并针对 .NET Core 9。这可以通过向项目文件添加以下内容来实现。

显示项目文件的一部分

什么是扩展方法?

C# 扩展方法允许你在不修改源代码或创建子类的情况下,为现有类型添加新方法。它们被定义为静态类中的静态方法,第一个参数前加 this 以指示被扩展的类型。只要在作用域内,它们看起来和行为上就像原生实例方法,这使得代码更易读、更具表现力。

扩展块的好处

与旧语法不同,扩展块允许您为类型定义扩展属性、运算符和静态成员。

旧语法

public static class StringExtensions
{
    public static string CapitalizeFirstLetter(this string sender)
        => string.IsNullOrEmpty(sender)
            ? sender
            : $"{char.ToUpper(sender[0])}{sender[1..].ToLower()}";
}

新语法

public static class StringExtensions
{
    extension(string sender)
    {
        public string CapitalizeFirstLetter()
            => string.IsNullOrEmpty(sender)
                ? sender
                : $"{char.ToUpper(sender[0])}{sender[1..].ToLower()}";
    }
}

用法

string firstName = "KAREN";
string lastName = "SMITH";

var fullName = $"{firstName.CapitalizeFirstLetter()} {lastName.CapitalizeFirstLetter()}";

“接收者”(即你正在扩展的实例)在整个代码块中只定义一次,使代码更简洁、更有条理。

接收者示例

shows receiver example

public static class BoolExtensions
{
    extension(bool value)
    {
        public string IsEmpty() =>
            value switch
            {
                true => "Yes is empty",
                _    => "No is not empty"
            };

        public string ToYesNo() =>
            value switch
            {
                true => "Yes",
                _    => "No"
            };
    }
}

在块内部,成员的声明方式与普通实例成员相同;您无需为每个方法重复 this 参数。

静态运算符(在 C# 14 之前不受支持)

public static class EnumerableExtensions
{
    // The generic T is defined at the block level
    extension(IEnumerable first)
    {
        // Extension operator
        // Note: At least one parameter must match the extended type (IEnumerable)
        public static IEnumerable operator +(IEnumerable left, IEnumerable right)
            => left.Concat(right);

        // Extension compound assignment (C# 14 feature)
        // Allows `collection += item` behavior
        public static IEnumerable operator +(IEnumerable left, T item)
            => left.Append(item);
    }
}

示例用法

var list1 = new[] { 1, 2 };
var list2 = new[] { 3, 4 };
var combined = list1 + list2; // Yields { 1, 2, 3, 4 }

扩展运算符的规则

  • 静态上下文:扩展运算符必须声明为 public static,就像标准运算符一样。
  • 身份规则:运算符的其中一个参数必须能够身份转换为被扩展的类型(例如,如果你扩展 T[],则必须有一个参数是 T[])。
  • 复合赋值:C# 14 引入了用户自定义的复合赋值运算符(如 +=),现在可以将其实现为扩展方法。

受约束的通用运算符

您可以将扩展运算符与通用数学约束(例如 INumber)结合使用,以在数字集合上执行算术运算。

public static class NumericExtensions
{
    extension(IEnumerable source) where T : INumber
    {
        public IEnumerable OnlyPositive => source.Where(x => x > T.Zero);
    }
}

文章源代码

console project structure

Summary

使用扩展块可以让开发者的代码更简洁,相比于 C# 14 之前的扩展方法,提高了可读性和可维护性。在团队采用扩展块时,请务必向习惯使用传统扩展方法的成员解释此特性。

Back to Blog

相关文章

阅读更多 »

2025 年 LLVM 回顾

请提供您希望翻译的具体摘录或摘要文本,我才能为您进行简体中文翻译。