Chapter 3 - Item 28 : Consider Enhancing Constructed Types with Extension Methods

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. 注意擴充的方法是否符合最小輸入原則(只輸入需要的參數)。