【More Effective C#】擴展方法
2010-10-12 08:17 空逸云 閱讀(617) 評論(1) 收藏 舉報 C#3.0中增加了許多新特性.其中.擴展方法允許我們在不修改原有代碼的基礎上擴展類/接口的功能.有技巧的運用該特性.能寫出有效率/易維護/美觀的代碼.
增強現有接口
C#2.0提供了許多泛型與容器的接口和類.最常見的如IComparable<T>常常需要新建一個Comparable來進行排序比較等等..但其默認只有一個CompareTo方法.在以前.我們只能手動添加.并且很難復用代碼.如今.利用擴展方法.可以很方便地擴展該接口.
public static class Comparable
{
public static bool LessThan<T>(this T left, T right) where T : IComparable<T>
{
return left.CompareTo(right) < 0;
}
public static bool GreaterThan<T>(this T left, T right) where T : IComparable<T>
{
return left.CompareTo(right) > 0;
}
public static bool LessThanEqual<T>(this T left, T right) where T : IComparable<T>
{
return left.CompareTo(right) <= 0;
}
public static bool GreaterThanEqual<T>(this T left, T right) where T : IComparable<T>
{
return left.CompareTo(right) >= 0;
}
}
如此一來.只要我們引用該類的命名空間.便可擴展的使用擴展方法.例如:
public class Student : IComparable<Student>
{
public int CompareTo(Student other)
{
return StuNo.CompareTo(other.StuNo);
}
public int StuNo { get; set; }
public string StuName { get; set; }
}
Student a = new Student() { StuNo = 1, StuName = "a" };
Student b = new Student() { StuNo = 2, StuName = "b" };
Console.WriteLine(a.LessThan(b));
注意!若是某個類需要定義一個方法,而這個類所實現的接口中也給出了同名的擴展方法,那么也許會導致一些意料之外的行為.根據方法的解析規則,類中的方法將會被優先調用,不過這個解釋發生在編譯器.若是通過接口來調用方法,則調用方法上的擴展方法,而非類的方法.
增強現有類型
除了能擴展接口.同樣.擴展方法對類也有強大的支持.C#3.0中提供了許多擴展方法.特別是對于泛型容器的支持特別豐富.有時候.我們可能也會根據需要增加自己的擴展方法.例如.有一個學生的容器.可能需要增加對于學生的特別查詢.如最近曠課最多的學生.請假最多的學生等.以前.我們可以自己寫一個學生的列表類StudentList繼承List<Student>.但現在我們可以直接擴展List<Student>.前者相比較后者,存在著更多的限制.擴展方法是用IEnumerable<Student>作為參數,而派生類基于List<Student>,即強制要求使用一種特定的存儲模型.因此.前者的做法無法與一系列的迭代方法組合使用.使方法的使用者受到不必要的約束.后者的使用更為靈活.
擴展方法的建議
雖然擴展方法給我們帶來很大的便利.但這不總是設計上的首選.只有在重用項目擴展功能.最好不要在不同的命名空間中聲明同名的擴展方法.這樣會增加后期的維護成本.擴展方法盡量不要重載.更應該使用與功能更貼切的簽名.
出處:http://kongyiyun.cnblogs.com
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
浙公網安備 33010602011771號