C# 14 扩展块
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()}";
“接收者”(即你正在扩展的实例)在整个代码块中只定义一次,使代码更简洁、更有条理。
接收者示例
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);
}
}
文章源代码
Summary
使用扩展块可以让开发者的代码更简洁,相比于 C# 14 之前的扩展方法,提高了可读性和可维护性。在团队采用扩展块时,请务必向习惯使用传统扩展方法的成员解释此特性。


