Effective C# (Covers C# 6.0), (includes Content Update Program): 50 Specific Ways to Improve Your C#, 3rd Edition By Bill Wagner 讀後心得
本節提出利用擴充方法擴充已建構型別類別或介面,如:IList<int>, Dictionary<int,string>。
範例情境:
1. 傳送酷碰券給指定的用戶群。
2. 取得過去一個月都沒下單的用戶群。
利用擴充方法擴充。
public static void sendEmailCoupons(
this IEnumerable<Customer> customers, Coupon spacialOffer )
{
// Elided
}
public static IEnumerable<Customer> lostProspects(
this IEnumerable<Customer> targetList )
{
return from c in targetList
where DateTime.Now - c.LastOrderDate > TimeSpan.FromDays( 30 )
select c;
}
另一種實現方式,直接在 CustomerList 類別實作。
public class CustomerList : List<Customer>
{
public void sendEmailCoupons( Coupon specialOffer )
{
// Elided
}
public IEnumerable<Customer> lostProspects( )
{
// Elided
}
}
擴充方式的實作比較符合現實情況,原因在於:
1. 兩種方法內需要的是 IEnumerable<Customer>,使用 CustomerList 不符合最小輸入原則。
2. IEnumerable<out T> out 特性可讓繼承自 Customer 的類別也可適用(covariance),而 List<T> 不行(invariance)。
結論:
1. 使用擴充方法擴充已建構型別類別或介面,
2. 注意擴充的方法是否符合最小輸入原則(只輸入需要的參數)。
1. 使用擴充方法擴充已建構型別類別或介面,
2. 注意擴充的方法是否符合最小輸入原則(只輸入需要的參數)。