顯然,擴充方法有助於簡化查詢範例,但除此之外,這些方法是否為廣泛有用的語言功能?事實證明擴充方法有多種用途。其中最常見用途可能是提供共用介面實作。例如,假設您有以下介面:
interface IDog
{
// 吠叫 2 秒
void Bark();
void Bark(int seconds);
}
此介面要求每個實作類別都需編寫適用於兩種多載的實作。有了「Orcas」版 C#,介面變得簡單:
interface IDog
{
void Bark(int seconds);
}
擴充方法可新增至另一個類別:
static class DogExtensions
{
// 吠叫 2 秒
public static void Bark(this IDog dog)
{
dog.Bark(2);
}
}
介面實作類別現在只需實作單一方法,但介面客戶端卻可自由呼叫任一多載。
我們現在擁有撰寫篩選子句的近乎理想語法,但「Orcas」版 C# 僅限於此嗎?並不全然。讓我們稍微擴充範例,相對於整個客戶物件,我們只投影出客戶名稱。如前所述,理想語法應採用如下形式:
sequence locals = customers.where(ZipCode == 98112).select(Name);
僅用我們討論過的語言擴充 (Lambda 運算式與擴充方法),此代碼可重寫為:
IEnumerable locals = customers.Where(c => c.ZipCode == 91822).Select(c => c.Name);
請注意,此查詢回傳型別不同,為 IEnumerable<string> 而非 IEnumerable<Customer>。因為我們僅從 select 陳述式回傳客戶名稱。
當投影只是單一欄位時,該方法確實有效。但假設我們不僅要回傳客戶名稱,還要回傳地址。理想語法應如下:
locals = customers.where(ZipCode == 98112).select(Name, Address);