想要快速產生一個唯讀屬性,可以使用下列幾種方式:
第一種寫法
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();
    }
}