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

C# 3.0自動屬性與匿名類型總結(五):匿名類型特性、作用域限制、相等比較與最佳實踐

     編輯:關於C語言

匿名類型核心特性總結

  • 引用類型**,直接繼承object,編譯器生成密封類。
  • 編譯器生成類型名**(如<>f__AnonymousType0`2),源代碼不可訪問。
  • 結構相等**:同屬性名、順序、類型的匿名類型視為同一類型,共享類型信息。
  • 只讀屬性**:初始化後不可修改,gname.Age = 26編譯報錯。
  • 方法作用域**:無法作為字段/屬性/參數/返回類型(private var x;非法)。
  • 不支持不安全類型**(指針等)。

相等比較行為演示


var a = new { Name = "yyao", Age = 24 };
var b = new { Name = "yyao", Age = 24 };

Console.WriteLine(a == b);           // False:引用比較
Console.WriteLine(a.Equals(b));      // True:逐屬性值比較
Console.WriteLine(a.GetHashCode() == b.GetHashCode()); // True:基於屬性計算

結論:匿名類型重寫Equals/GetHashCode實現值語義,適合作為字典鍵、集合元素、LINQ分組鍵。

作用域限制實證


// 編譯錯誤:var 只能出現在局部變量聲明中
// private var _field; 
// private var _prop = new { Name = "test" };

必須配合var在方法內使用,跨方法傳遞需用object或dynamic(失去強類型優勢)。

最佳實踐建議

  1. 僅用於臨時/局部數據封裝**(LINQ投影、中間計算結果)。
  2. 避免作為公共API參數/返回值**,改用具名類型/Record(C# 9+)。
  3. 利用值語義**:放心用於Distinct、GroupBy、Dictionary鍵。
  4. 屬性名保持一致**:同結構不同順序會生成不同類型,影響復用。

匿名類型是C# 3.0為LINQ量身打造的特性,理解其編譯器生成機制與語義邊界,能避免濫用帶來的維護陷阱。

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