写点什么

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

作者:qife122
  • 2025-11-22
    福建
  • 本文字数:1125 字

    阅读完需:约 4 分钟

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

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


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


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

什么是扩展成员?

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


extension System.String{    // 实例扩展    int WordCount() => this.Split(' ').Length;
// 静态扩展 static bool IsNullOrEmpty(string? value) => string.IsNullOrEmpty(value);}
复制代码

前后对比

之前(经典扩展方法)

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

之后(扩展块)

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

示例

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

使用方式

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

扩展成员优先级规则

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

示例

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)

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

使用方式

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


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

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

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

使用方式

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


这允许使用惯用的切片方式,而无需编写自己的助手代码。更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)


公众号二维码


办公AI智能小助手


公众号二维码


网络安全技术点滴分享


用户头像

qife122

关注

还未添加个人签名 2021-05-19 加入

还未添加个人简介

评论

发布
暂无评论
C#扩展成员全面解析:从方法到属性的演进_C#_qife122_InfoQ写作社区