在编程中,经常需要对现有的类型添加新的方法,但又不想通过继承或者重新编译的方式来实现。在C#中,扩展方法(Extension Methods)提供了一种解决方案。扩展方法是一种特殊的静态方法,它们允许为现有的类型添加方法,而不需要修改原有代码。LINQ查询操作符就是扩展方法的一个例子,它为IEnumerable和IEnumerable
在C#中,System.Array、System.Collections.ArrayList和System.Collections.Generic.List
要对这些类型的列表进行排序,通常需要将集合转换为上述支持Sort方法的类型,或者实现自己的排序算法。这时,扩展方法的概念就派上了用场。可以创建一个扩展方法,它适用于所有实现了IList
扩展方法在静态类中实现,并且第一个参数前需要有this修饰符,后面跟着要扩展的类型。以下是一个使用扩展方法实现的冒泡排序算法的示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Extensions
{
public static class SortingExtensionProvider
{
public static void Sort(this IList list) where T : IComparable
{
Sort(list, 0, list.Count - 1);
}
public static void Sort(this IList list, int startIndex, int endIndex) where T : IComparable
{
for (int i = startIndex; i < endIndex; i++)
{
for (int j = endIndex; j > i; j--)
{
if (list[j].IsLesserThan(list[j - 1]))
{
list.Exchange(j, j - 1);
}
}
}
}
private static void Exchange(this IList list, int index1, int index2)
{
T tmp = list[index1];
list[index1] = list[index2];
list[index2] = tmp;
}
private static bool IsLesserThan(this IComparable value, IComparable item)
{
return value.CompareTo(item) < 0;
}
}
}
需要注意的是,Exchange
通过使用using Extensions;指令,IList
2008年7月25日:更新了扩展方法的实现细节。