65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 中的扩展方法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.48/5 (43投票s)

2009年3月17日

CPOL

3分钟阅读

viewsIcon

186443

扩展方法作为 C# 的增强功能之一

引言

在本文中,我想介绍 C# 3.0 的一项新增强功能“扩展方法”等。此功能在 C# 3.0 编译器及更高版本(C# 4.0)中可用;对于所有开发人员来说,此功能都非常重要,特别是如果您想利用 C# 增强功能的动态性来影响您的类设计。

为什么我们需要扩展方法?

在 .NET 项目中设计类时,我们通常会有兄弟类,它们从父类执行简单的操作,以便为父类的方法添加某种自定义。假设您想通过添加一个使用递归技术的阶乘方法来扩展 .NET 中的 int 类。

一种想法是继承 int 类并将您的新方法添加到其中,并在您的代码中使用您的新方法。这是一个有效的解决方案,但让我们看看扩展方法可以为我们提供什么。

使用扩展方法,您可以将您的新方法用作 .NET 中 int 类的一部分。

在上面的屏幕截图中,我编写了以下代码行

int x = 3;
x.factorial();

通过在我的类中实现阶乘方法作为扩展方法,阶乘方法成为 int 类的一部分,而无需继承 .NET 中的 int 类,请参见下文(图 1.1)。

扩展方法图 1.1

扩展方法的规范是什么?

扩展方法是一种特殊的 static 方法,允许您向现有类型添加新方法,而无需创建派生类型。

调用扩展方法就像它们是扩展类型的实例方法一样,例如:xint 类的一个对象,我们在 int 类中将其作为实例方法调用。

如何创建我的扩展方法?

简单来说,您可以在您的类中创建自己的 static 方法,并在该方法(将被扩展的类型)的第一个参数前放置 this 关键字。

public static class MyMathExtension 
{ 
    public static int factorial(this int x) 
    { 
        if (x <= 1) return 1; 
        if (x == 2) return 2; 
        else 
            return x * factorial(x - 1); 
    } 
}

我的演示的完整代码

namespace ConsoleApplication1 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            int x = 3; 
            Console.WriteLine(x.factorial()); 
            Console.ReadLine(); 
        } 
    } 
    public static class MyMathExtension 
    { 
        public static int factorial(this int x) 
        { 
            if (x <= 1) return 1; 
            if (x == 2) return 2; 
            else 
                return x * factorial(x - 1); 
        } 
    }
}

扩展方法使用中的一般提示

本节是可选阅读章节,用于理解扩展方法的核心思想

  1. This 关键字必须是扩展方法参数列表中的第一个参数。
  2. 扩展方法在 C# 3.0 及更高版本中被广泛使用,特别是对于 C# 中的 LINQ 扩展,例如
    int[] ints = { 10, 45, 15, 39, 21, 26 };
    
    var result = ints.OrderBy(g => g);

    在此,order by 是 IEnumerable<T> 接口实例的扩展方法示例,括号内的表达式是 lambda 表达式。

  3. 重要的是要注意,扩展方法无法访问扩展类型中的 private 方法。
  4. 如果您想向某种类型添加新方法,但您没有它的源代码,那么理想的解决方案是使用和实现该类型的扩展方法。
  5. 如果您创建的扩展方法与您正在扩展的类型中的签名方法相同,则永远不会调用扩展方法。

结论

在本文中,我陈述了在 C# 中使用扩展方法的好处,该功能从 C# 3.0 及更高版本开始提供。

重要的是要注意我在文章中提到的提示,以便在您实现扩展方法时使用。

历史

  • 2009 年 3 月 17 日:初始发布
© . All rights reserved.