首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

LINQ 演進歷程與對 C# 設計的影響(三):擴充方法與投影語法

     編輯:關於C語言

擴充方法

顯然,擴充方法有助於簡化查詢範例,但除此之外,這些方法是否為廣泛有用的語言功能?事實證明擴充方法有多種用途。其中最常見用途可能是提供共用介面實作。例如,假設您有以下介面:

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);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved