查詢投影僅需 Name、Price,卻須寫完整類:
public class BookAsGood
{
private string _name; private decimal _price;
public string Name { get => _name; set => _name = value; }
public decimal Price { get => _price; set => _price = value; }
}
屬性多時代碼量巨大,維護負擇重。
C# 3.0 允許無類型名的 new 表達式配合對象初始化器:
var book = new { Name = "C#", Price = 100m };
// 編譯器自動生成:私有字段、公共屬性、構造函數、Equals/GetHashCode/ToString
為對象屬性指定值的語法:{ Prop = value }。匿名類型建立在對象初始化器之上,「初始化器即類型定義」。
使用 ILDASM 可見編譯器生成的具體類型(如 <Projection>f__0),源碼層面無名稱。
匿名類型將「定義類型」與「創建實例」融合為單一聲明式語法,編譯器承擔樣板代碼生成職責。適用於查詢投影、臨時聚合、配置對象等「形狀重要、名稱不重要」場景,是 LINQ 查詢表達式 select new { ... } 的核心載體。