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

C# 3.0 入門系列(四):Select 查詢投影與匿名類型深度解析

     編輯:關於C語言

Select 投影中的匿名類型

在上一節的 Select 操作中,我們已經見過匿名類型的身影。其實,不只 Select,其他 LINQ 操作符也大量使用匿名類型。以下兩種寫法是完全等價的:

var q = from c in db.Customers
        select new { c.ContactName, c.Phone };

var q = db.Customers.Select(c => new { c.ContactName, c.Phone });

匿名類型 是 C# 3.0 的新特性,本質上是編譯器根據使用者定義的屬性,自動產生一個內部唯一、無名稱的類別,用於暫存查詢投影的結果。注意:它只適合作為「臨時變數」,大量濫用會降低程式碼可讀性。

物件初始化器:匿名類型的基石

匿名類型依賴另一項 C# 3.0 特性——物件初始化器。過去我們只能透過建構函式建立物件,現在可以直接指定屬性值:

public class Person {
    public string Name { get; set; }
}

// C# 3.0 物件初始化器語法
var p = new Person { Name = "Tom" };

編譯器會自動生成對應的屬性設定代碼。正是有了這項能力,匿名類型才能語法上成立:

var anon = new { Name = "Tom", Age = 25 };

編譯器自動產生一個包含 Name、Age 兩個唯讀屬性的匿名類別,並完成實例化。

var 關鍵字 ≠ 弱型別

許多開發者誤以為 var 讓 C# 變成弱型別語言。事實上,var 只是編譯器關鍵字,編譯器會根據初始化運算式的型別進行靜態型別推斷。因此:

  • var i = 10; → 型別為 int
  • var s = "hello"; → 型別為 string
  • var n = new { X = 1 }; → 型別為匿名類型

var x = null; 無法編譯,因為編譯器無法從 null 推斷具體型別。C# 3.0 依然是強型別語言,所有型別在編譯期確定。

匿名類型屬性命名規則

在查詢投影中,匿名類型屬性命名有兩種形式:

// 1. 隱含命名:直接使用成員名稱
select new { c.ContactName, c.Phone }
// 屬性名自動為 ContactName、Phone

// 2. 顯式命名:指定屬性別名
select new { Name = c.FirstName + " " + c.LastName, Phone = c.HomePhone }
// 屬性名為 Name、Phone

// 3. 混合使用
select new { p.ProductID, HalfPrice = p.UnitPrice / 2 }
// ProductID 保留原名,HalfPrice 為自訂名稱

DLINQ 會根據這些屬性定義,在執行查詢時動態建立對應的匿名類型實例,並填入資料庫欄位值。

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