C# 中的扩展方法






4.48/5 (43投票s)
扩展方法作为 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)。
扩展方法的规范是什么?
扩展方法是一种特殊的 static
方法,允许您向现有类型添加新方法,而无需创建派生类型。
调用扩展方法就像它们是扩展类型的实例方法一样,例如:x
是 int
类的一个对象,我们在 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);
}
}
}
扩展方法使用中的一般提示
本节是可选阅读章节,用于理解扩展方法的核心思想
- This 关键字必须是扩展方法参数列表中的第一个参数。
- 扩展方法在 C# 3.0 及更高版本中被广泛使用,特别是对于 C# 中的 LINQ 扩展,例如
int[] ints = { 10, 45, 15, 39, 21, 26 }; var result = ints.OrderBy(g => g);
在此,order by 是
IEnumerable<T>
接口实例的扩展方法示例,括号内的表达式是 lambda 表达式。 - 重要的是要注意,扩展方法无法访问扩展类型中的
private
方法。 - 如果您想向某种类型添加新方法,但您没有它的源代码,那么理想的解决方案是使用和实现该类型的扩展方法。
- 如果您创建的扩展方法与您正在扩展的类型中的签名方法相同,则永远不会调用扩展方法。
结论
在本文中,我陈述了在 C# 中使用扩展方法的好处,该功能从 C# 3.0 及更高版本开始提供。
重要的是要注意我在文章中提到的提示,以便在您实现扩展方法时使用。
历史
- 2009 年 3 月 17 日:初始发布