程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> LINQ的演變及其對C#設計的影響(5)

LINQ的演變及其對C#設計的影響(5)

編輯:關於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# 中創建查詢的簡潔語法。盡管如此,我們還有一種可擴展途徑,可通過擴展方法以及一組本身非常有用的語言功能來添加新的運算符(Distinct、OrderBy、Sum 等)。

語言設計團隊現在有了數種可賴以獲得反饋的原型。因此,我們與許多富於 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 ZIP Code 區居住的客戶人數。

通過該種方法,我們已經設法在結束時達到了開始時的目標(我對這一點始終覺得非常滿意)。下一版本的 C# 的語法歷經數年時間的發展,嘗試了許多新的語言功能,才最終到達近乎於 2004 年冬提議的原始語法的境界。查詢表達式的加入以 C# 即將發布的版本的其他語言功能為基礎,並促使許多查詢情況更便於具有 SQL 背景的開發人員閱讀和理解。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved