C# 扩展方法

发布于:2025-07-04 ⋅ 阅读:(13) ⋅ 点赞:(0)

扩展方法

扩展方法是C#中一种特殊的静态方法,它定义在一个静态类中,但是可以像实例方法一样被调用,使得代码看起来更为直观和易于阅读。扩展方法允许你在不修改原始类的情况下,添加新的方法到现有的类型中。

有↓箭头的是扩展方法

扩展方法的定义需要满足以下条件:

  • 它必须在一个静态类中定义。
  • 它必须是一个静态方法。
  • 它的第一个参数是用 this 关键字修饰的,指定了该方法作用于哪个类型。
  • 第一个参数的类型必须是要扩展的类型,或者是从该类型派生的类型。

使用示例

// 扩展方法定义
public static class StringExtension
{
    public static int CountLines(this string str)
    {
        if (string.IsNullOrEmpty(str)) return 0;
        return str.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries).Length;
    }
}

// 使用扩展方法
string text = "Hello\nWorld";
int lineCount = text.CountLines(); // 返回 2

 

扩展方法的调用优先级

扩展方法不会真正修改原始类型,调用时遵循以下优先级规则:

  • 实例方法优先:如果类型本身有同名同参数的实例方法,扩展方法不会被调用。
  • 最近命名空间优先:当多个命名空间中存在同名扩展方法时,编译器优先选择最近显式导入的命名空间中的方法。
  • 子类覆盖父类:如果扩展方法作用于父类,子类可以通过定义自己的实例方法 “覆盖” 该扩展方法。

 示例:

namespace MyExtensions
{
    public static class ObjectExtensions
    {
        //使用 this object obj 是为了更清晰地演示 “实例方法优先于扩展方法” 的核心规则
        public static string GetInfo(this object obj) => "扩展方法";
    }
}

public class MyClass
{
    public string GetInfo() => "实例方法"; // 优先于扩展方法
}

// 使用
var obj = new MyClass();
Console.WriteLine(obj.GetInfo()); // 输出:实例方法

扩展方法的基本原则:

  • C#只支持扩展方法,不支持扩展属性、扩展事件、扩展操作符等。
  • 扩展方法(第一个参数前面是this的方法)必须在非泛型的静态类中声明,扩展方法必须有一个参数,而且只有第一个参数使用this标记。
  • C#编译器查找静态类中的扩展方法时,要求这些静态类本身必须具有文件作用域。
  • C#编译要求“导入”扩展方法。(静态方法可以任意命名,C#编译器在寻找方法时,需要花费时间进行查找,需要检查文件作用域中的所有的静态类,并扫描它们的所有静态方法来查找一个匹配)
  • 多个静态类可以定义相同的扩展方法。
  • 用一个扩展方法扩展一个类型时,同时也扩展了派生类型。