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

LINQ 演進歷程與對 C# 設計的影響(五):查詢運算式與物件初始化設定式

     編輯:關於C語言

物件初始化設定式

為解決此問題,即將釋出的「Orcas」版本提供稱為物件初始化設定式的 C# 語言功能。物件初始化設定式主要允許在單一運算式中為多個屬性或欄位指派值。例如,建立物件的常見模式:

Customer customer = new Customer();
customer.Name = "Roger";
customer.Address = "1 Wilco Way";

此時 Customer 沒有接受名稱與地址的建構函式;但存在 Name 與 Address 兩個屬性,建立實例後即可設定。物件初始化設定式允許使用以下語法建立相同結果:

Customer customer = new Customer()
{ Name = "Roger", Address = "1 Wilco Way" };

在先前的 CustomerTuple 範例中,我們透過呼叫建構函式建立 CustomerTuple 類別。也可用物件初始化設定式獲得同樣結果:

var locals =
    customers
    .Where(c => c.ZipCode == 91822)
    .Select(c =>
        new CustomerTuple { Name = c.Name, Address = c.Address });

請注意,物件初始化設定式允許省略建構函式的括號。此外,欄位與可設定屬性均可在物件初始化設定式主體內指派。

我們現在擁有在 C# 中建立查詢的簡潔語法。儘管如此,仍有一種可擴充途徑,可透過擴充方法以及一組本身非常有用的語言功能來新增運算子。

語言設計團隊現在有數種原型可供回饋。因此,我們組織了一項可用性研究,參與者多具備 C# 與 SQL 經驗。幾乎所有回饋皆為肯定,但明顯疏忽某些東西。具體而言,開發人員難以應用其 SQL 知識,因為我們認為理想的語法與他們擅長領域的專門技術並不吻合。

查詢運算式

於是,語言設計團隊設計了一種更接近 SQL 的語法,稱為查詢運算式。例如,針對我們範例的查詢運算式如下:

var locals = from c in customers
             where c.ZipCode == 91822
             select new { FullName = c.FirstName + " " + c.LastName, HomeAddress = c.Address };

查詢運算式建基於上述語言功能。它們在語法上完全轉換為我們已見的基礎語法。例如,上述查詢可直接轉換為:

var locals =
    customers
    .Where(c => c.ZipCode == 91822)
    .Select(c => new { FullName = c.FirstName + " " + c.LastName, HomeAddress = c.Address });

查詢運算式支援許多不同「子句」,如 from、where、select、orderby、group by、let 與 join。這些子句先轉換為對等的運算子呼叫,後者再透過擴充方法實現。若查詢語法不支援必要運算子的子句,查詢子句與實現運算子的擴充方法間的緊密關係使兩者易於結合。例如:

var locals = (from c in customers
              where c.ZipCode == 91822
              select new { FullName = c.FirstName + " " + c.LastName, HomeAddress = c.Address })
             .Count();

此例中,查詢回傳居住在 91822 郵遞區號區的客戶人數。

透過此方法,我們設法在結束時達到開始時的目標(我對此始終感到滿意)。下一版 C# 的語法歷經數年發展,嘗試許多新語言功能,最終達到近乎 2004 年冬提議的原始語法境界。查詢運算式的加入以 C# 即將釋出版本的其他語言功能為基礎,並使許多查詢情境更便於具備 SQL 背景的開發人員閱讀與理解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved