[C#] 比較各種 C# 屬性 Getter 寫法的差異

想要快速產生一個唯讀屬性,可以使用下列幾種方式:

第一種寫法

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();
    }
}

 

驗證程式連結: https://github.com/renewal-wu/GetterComparison