源代碼:
var noname = new { NameA = "dd", Age = 24 };
var qname = new { NameA = "ff", Age = 25 };
編譯器生成的等價C#偽代碼:
class __Anonymous1
{
private string _nameA;
private int _age;
public string NameA { get => _nameA; set => _nameA = value; }
public int Age { get => _age; set => _age = value; }
}
__Anonymous1 noname = new __Anonymous1();
noname.NameA = "dd";
noname.Age = 24;
__Anonymous1 qname = new __Anonymous1(); // 復用同一類型
qname.NameA = "ff";
qname.Age = 25;
使用ILDasm.exe查看編譯後程序集:
.exe/.dll。<>f__AnonymousType0`2類型。noname與qname均為該類型實例。結論:編譯器識別結構相同(屬性名、順序、類型均同)的匿名類型,僅生成一個**類型定義,多處復用。
public class EDClass
{
public string Name { get; private set; }
public EDClass() => Name = "QQ1";
public void SetName() => Name = "QQ";
public void TestAnonymous()
{
var noname = new { NameA = "dd", Age = 24 };
var qname = new { NameA = "ff", Age = 25 };
Console.WriteLine(qname == noname); // False
Console.WriteLine(qname.Equals(noname)); // True
Console.WriteLine(qname.GetHashCode() == noname.GetHashCode()); // True
}
}