C#扩展成员全面解析:从方法到属性的演进

C#扩展成员:你需要知道的一切

扩展方法在C#中已经存在很长时间。它们允许你向现有类型添加新方法,而无需修改其源代码。这在处理你无法控制的框架或库中的类型时非常有用。

然而,扩展方法有一个令人烦恼的地方:每个方法都必须在静态类中定义,并且每个方法都必须使用this修饰符声明第一个参数。当你为同一类型编写多个扩展方法时,代码开始变得重复。

扩展成员就是为了解决这个问题而引入的,它允许你将扩展方法分组到与特定类型相关的扩展块中。

什么是扩展成员?

扩展成员允许你定义这样的扩展范围:

csharp 复制代码
extension System.String
{
    // 实例扩展
    int WordCount() => this.Split(' ').Length;

    // 静态扩展
    static bool IsNullOrEmpty(string? value) => string.IsNullOrEmpty(value);
}

前后对比

之前(经典扩展方法)

csharp 复制代码
public static class StringExtensions
{
    public static int WordCount(this string text)
    {
        return text.Split(' ').Length;
    }
}

之后(扩展块)

csharp 复制代码
extension System.String
{
    int WordCount() => this.Split(' ').Length;
}

示例

csharp 复制代码
extension System.String
{
    bool IsLong() => this.Length > 20;
    static string? EmptyIfNull(string? value) => value ?? string.Empty;
}

使用方式

csharp 复制代码
string message = "Hello World";
bool isLong = message.IsLong();
string result = string.EmptyIfNull(null);

扩展成员优先级规则

扩展成员的优先级总是低于类型的现有成员。这意味着:如果类型已经定义了同名方法,则使用类型的方法。

示例

csharp 复制代码
extension System.String
{
    string ToUpper() => "Extension ToUpper called";
}

var text = "hello";
Console.WriteLine(text.ToUpper());

输出: HELLO => 内置的string.ToUpper()获胜

C# 14中的扩展成员 - 有什么变化?

C# 13引入了扩展块,允许你更自然地定义现有类型的方法和静态助手。C# 14进一步扩展了这一功能,允许你定义更多种类的成员,而不仅仅是方法。

示例:扩展属性(C# 14)

csharp 复制代码
extension System.String
{
    int WordCount => this.Split(' ', StringSplitOptions.RemoveEmptyEntries).Length;
}

使用方式

csharp 复制代码
string text = "Hello world from C#";
Console.WriteLine(text.WordCount); // 4

没有括号。它的行为完全类似于只读属性。

示例:扩展索引器(C# 14)

csharp 复制代码
extension System.String
{
    char this[Index index] => this[index];
}

使用方式

csharp 复制代码
string s = "Hello";
Console.WriteLine(s[^1]); // o

这允许使用惯用的切片方式,而无需编写自己的助手代码。

相关推荐
机器之心15 分钟前
英伟达护城河被AI攻破,字节清华CUDA Agent,让人人能搓CUDA内核
人工智能·openai
后端小肥肠1 小时前
公众号躺更神器!OpenClaw+Claude Skill 实现自动读对标 + 写文 + 配图 + 存入草稿箱
人工智能·aigc·agent
拳打南山敬老院1 小时前
Context 不是压缩出来的,而是设计出来的
前端·后端·aigc
爱可生开源社区2 小时前
SCALE | 重构 AI 时代数据库能力的全新评估标准
人工智能
Jahzo2 小时前
openclaw本地化部署体验与踩坑记录--飞书机器人配置
人工智能·开源
Narrastory2 小时前
明日香 - Pytorch 快速入门保姆级教程(一)
人工智能·pytorch·深度学习
数据智能老司机2 小时前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机2 小时前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
Narrastory2 小时前
明日香 - Pytorch 快速入门保姆级教程(二)
人工智能·pytorch·深度学习
AI攻城狮2 小时前
OpenClaw Session 管理完全指南:Context 压缩、重置与持久化
人工智能·云原生·aigc