透過下列程式碼觀察 GetHashCode、Equals、==、ToString 及型別身分:
class Program
{
static void Main(string[] args)
{
var p1 = new { Name = "IORI", Age = 27 };
var p2 = new { Name = "IORI", Age = 27 };
var p3 = new { Name = "GUOJUN", Age = 27 };
var p4 = new Person { Name = "GUOJUN", Age = 27 };
Console.WriteLine("Base class of {0} is {1}", p1.GetType().Name, p1.GetType().BaseType);
Console.WriteLine("p1.ToString() = {0}", p1.ToString());
Console.WriteLine("p1.GetType() = {0}", p1.GetType());
Console.WriteLine("p3.GetType() = {0}", p3.GetType());
Console.WriteLine("p4.GetType() = {0}", p4.GetType());
Console.WriteLine("p1.GetHashCode() = {0}", p1.GetHashCode());
Console.WriteLine("(p1.GetHashCode() == p2.GetHashCode()) = {0}", p1.GetHashCode() == p2.GetHashCode());
Console.WriteLine("(p1.GetHashCode() == p3.GetHashCode()) = {0}", p1.GetHashCode() == p3.GetHashCode());
Console.WriteLine("p1.Equals(p2) = {0}", p1.Equals(p2));
Console.WriteLine("p1.Equals(p3) = {0}", p1.Equals(p3));
Console.WriteLine("p3.Equals(p4) = {0}", p3.Equals(p4));
Console.WriteLine("(p1 == p2) = {0}", p1 == p2);
Console.WriteLine("object.ReferenceEquals(p1.GetType(), p2.GetType()) = {0}", object.ReferenceEquals(p1.GetType(), p2.GetType()));
Console.WriteLine("object.ReferenceEquals(p1.GetType(), p3.GetType()) = {0}", object.ReferenceEquals(p1.GetType(), p3.GetType()));
Console.WriteLine("object.ReferenceEquals(p3.GetType(), p4.GetType()) = {0}", object.ReferenceEquals(p3.GetType(), p4.GetType()));
Console.Read();
}
}
class Person
{
public int Age { get; set; }
public string Name { get; set; }
}

{ Name = IORI, Age = 27 } 格式字串。System.Object。get)。sealed)。編譯器不會為每個
{ Prop = val, ... }結構產生不同型別,而是依屬性名稱、型別、宣告順序決定型別身分(不含屬性值)。相同屬性簽章的匿名物件共享同一型別,皆為該型別的實例。
限制:此共享僅限於同一組件內。跨組件編譯會產生不同型別。