想要快速產生一個唯讀屬性,可以使用下列幾種方式:
第一種寫法
public object Test { get; } = new object();
第二種寫法
public object Test => new object();
第三種寫法
public object Test { get => new object(); }
這幾種寫法乍看之下似乎能達成一致的效果,但實際運作可能與開發者想像的不同。
解析第一種方法
等同於
private object test = new object();
public object Test
{
get
{
return test;
}
}
解析第二種寫法與第三種寫法
等同於
public object Test
{
get
{
return new object();
}
}
這三種寫法的差異在於,使用第一種寫法則每次呼叫 Test 屬性都會回傳同一個 object;而使用第二種寫法與第三種寫法則會每次呼叫 Test 屬性時都會重新產生並回傳新的 object。
撰寫簡單的程式來驗證
internal class Program
{
public static object Test1 { get; } = new object();
public static object Test2 => new object();
public static object Test3 { get => new object(); }
private static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
// 每次都能取得相同的 HashCode
Console.WriteLine($"Test1.GetHashCode(): { Test1.GetHashCode() }");
}
for (int i = 0; i < 5; i++)
{
// 每次都會取得不同的 HashCode
Console.WriteLine($"Test2.GetHashCode(): { Test2.GetHashCode() }");
}
for (int i = 0; i < 5; i++)
{
// 每次都會取得不同的 HashCode
Console.WriteLine($"Test3.GetHashCode(): { Test3.GetHashCode() }");
}
Console.WriteLine();
// true
Console.WriteLine($"Test1 == Test1 ? { Test1 == Test1 }");
// false
Console.WriteLine($"Test2 == Test2 ? { Test2 == Test2 }");
// false
Console.WriteLine($"Test3 == Test3 ? { Test3 == Test3 }");
Console.ReadKey();
}
}