擴展方法
顯然,擴展 方法有助於簡化我們的查詢示例,但除此之外,這些方法是不是一種廣泛有用的語言功能呢?事實證明擴展方法有多種用途。其中一個最常見的用途可能是提供共享接口實現。例如,假設您有以下接口:
interface IDog
{
// Barks for 2 seconds
void Bark();
void Bark(int seconds);
}
此接口要求每個實現器都應編寫適用於兩種重載的實現。有了“Orcas”版 C#,接口變得很簡單:
interface IDog
{
void Bark(int seconds);
}
擴展方法可添加到另一個類:
static class DogExtensions
{
// Barks for 2 seconds
public static void Bark(this IDog dog)
{
dog.Bark(2);
}
}
接口實現器現在只需實現單一方法,但接口客戶端卻可以自由調用任一重載。
Close [x]
我們現在擁有了用於編寫篩選子句的非常接近理想的語法,但“Orcas”版 C# 僅限於此嗎?並不全然。讓我們對示例稍作擴展,相對於整個客戶對象,我們只投影出客戶名稱。如我前面所述,理想的語法應采用如下形式:
sequence locals =customers.where(ZipCode == 98112).select(Name);
僅用我們討論過的語言擴展,即 lambda 表達式和擴展方法,此代碼可重新編寫為如下所示:
IEnumerable locals = customers.Where(c => c.ZipCode == 91822).Select(c => c.Name);
請注意,此查詢的返回類型不同,它是 IEnumerable 而不是 IEnumerable。這是因為我們僅從 select 語句中返回客戶名稱。
當投影只是單一字段時,該方法確實很有效。但是,假設我們不僅要返回客戶的名稱,還要返回客戶的地址。理想的語法則應如下所示:
locals = customers.where(ZipCode == 98112).select(Name, Address);