3 回答
TA貢獻1784條經(jīng)驗 獲得超9個贊
您有兩組等效的構造。
第 1 組
當您不需要對構造函數(shù)外部的支持字段進行寫訪問時,可以使用以下任何構造:
private readonly int _x;
public int x => _x;
或者
private readonly int _x;
public int x { get => _x; }
或者
private readonly int _x;
public int x { get { return _x; } }
或者
public int x { get; }
第2組
當您需要訪問構造函數(shù)外部的支持字段時,可以使用以下任何構造:
private int _x;
public int x => _x;
或者
private int _x;
public int x { get => _x; }
或者
private int _x;
public int x { get { return _x; } }
或者
public int x { get; private set; }
您可以預期所有替代方案都同樣快。在最后一個構造中,編譯器將注入一個 setter 方法(對于每個自動屬性,它也會注入一個支持字段)。在其他情況下,您可以直接訪問該字段。注入的 setter 幾乎肯定會被抖動內(nèi)聯(lián),這消除了方法調(diào)用的性能損失。查看此問答以了解有關 JIT 內(nèi)聯(lián)的詳細信息。
自動屬性當然更簡潔,這使您的代碼更整潔,尤其是當您有很多屬性時。但歸根結(jié)底,這取決于個人喜好(或您團隊的編碼規(guī)則)。
TA貢獻1772條經(jīng)驗 獲得超6個贊
請注意,如果您在構造函數(shù)中初始化該屬性,甚至還有另一種可能性
public int X { get; }
這是 C# 6.0 中引入的僅 getter 屬性。您可以在構造函數(shù)中分配它(然后再也不會)
public MyClass (int x) // Constructor
{
? ? X = x;
}
或使用初始化器
public int X { get; } = 100;
你不應該關心這些事情的速度。創(chuàng)建易于閱讀且健壯的代碼。C# 編譯器或 Jitter(應用程序啟動時運行的即時編譯器,第一次調(diào)用方法)可能會內(nèi)聯(lián)代碼,甚至不調(diào)用 getter 或 setter。
普通屬性、方法和構造函數(shù)與表達式主體之間的區(qū)別僅在于語法性質(zhì)。行為上沒有區(qū)別。兩種變體都生成相同的編譯 IL 代碼,因此速度沒有差異。
public int X => _x;只是 的更短語法public int X { get { return _x; } }。這也稱為語法糖。
TA貢獻1797條經(jīng)驗 獲得超6個贊
如果您使用私有支持字段,您將封裝信息并創(chuàng)建更健壯的代碼。在某些情況下它還提高了可讀性。
還有一個事實是,該值被安全地存儲在一個字段中,因此,如果您的 getter 和 setter 中的邏輯需要在將來更改,那么它會與實際的值存儲分離,并使將來更容易更改該實現(xiàn)
- 3 回答
- 0 關注
- 235 瀏覽
添加回答
舉報
