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

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

相关推荐
字节跳动视频云技术团队21 小时前
拒绝被剧透!解密大型赛事直播背后的超低延迟黑科技
人工智能·音视频开发·直播
码农学院21 小时前
电商零售品牌的6个技术信号——从JSON-LD结构化数据到llms.txt,让AI搜索主动推荐你的产品
人工智能·json·零售
码农胖大海21 小时前
AI 辅助学习的正确姿势和方法
人工智能·程序员·ai编程
南讯股份Nascent21 小时前
颖通电商全渠道项目启动会成功举办
大数据·人工智能·物联网
杭州默安科技21 小时前
从告警到多防火墙联动封禁:智能体与XDR的自动化响应实践
人工智能·网络安全
ltqvibe21 小时前
AIGS不是AIGC——AI生成的是服务不是内容
人工智能·aigc
XTIOT66621 小时前
CRPT 诚实标识采集落地技术实践:分工况硬件选型与合规数据标准化解决方案
大数据·运维·人工智能·嵌入式硬件·物联网
在书中成长21 小时前
HarmonyOS 小游戏《对战五子棋》开发第14篇 - 困难AI实现:Minimax算法原理详解
人工智能·算法·harmonyos
YOLO数据集集合21 小时前
机雾天航拍挑战:11,600张雾霾场景目标检测数据集全解析
人工智能·目标检测·目标跟踪
图特摩斯科技21 小时前
从Palantir本体论角度对广西洪水的一点思考:如果有 OntoFlow 这类本体平台,应急管理能够做到什么?
人工智能·abutiongraph·palantir·ontology·ontoflow·ontoos