3 回答

TA貢獻1784條經驗 獲得超9個贊
您有兩組等效的構造。
第 1 組
當您不需要對構造函數外部的支持字段進行寫訪問時,可以使用以下任何構造:
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組
當您需要訪問構造函數外部的支持字段時,可以使用以下任何構造:
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 幾乎肯定會被抖動內聯,這消除了方法調用的性能損失。查看此問答以了解有關 JIT 內聯的詳細信息。
自動屬性當然更簡潔,這使您的代碼更整潔,尤其是當您有很多屬性時。但歸根結底,這取決于個人喜好(或您團隊的編碼規(guī)則)。

TA貢獻1772條經驗 獲得超6個贊
請注意,如果您在構造函數中初始化該屬性,甚至還有另一種可能性
public int X { get; }
這是 C# 6.0 中引入的僅 getter 屬性。您可以在構造函數中分配它(然后再也不會)
public MyClass (int x) // Constructor
{
? ? X = x;
}
或使用初始化器
public int X { get; } = 100;
你不應該關心這些事情的速度。創(chuàng)建易于閱讀且健壯的代碼。C# 編譯器或 Jitter(應用程序啟動時運行的即時編譯器,第一次調用方法)可能會內聯代碼,甚至不調用 getter 或 setter。
普通屬性、方法和構造函數與表達式主體之間的區(qū)別僅在于語法性質。行為上沒有區(qū)別。兩種變體都生成相同的編譯 IL 代碼,因此速度沒有差異。
public int X => _x;
只是 的更短語法public int X { get { return _x; } }
。這也稱為語法糖。

TA貢獻1797條經驗 獲得超6個贊
如果您使用私有支持字段,您將封裝信息并創(chuàng)建更健壯的代碼。在某些情況下它還提高了可讀性。
還有一個事實是,該值被安全地存儲在一個字段中,因此,如果您的 getter 和 setter 中的邏輯需要在將來更改,那么它會與實際的值存儲分離,并使將來更容易更改該實現
- 3 回答
- 0 關注
- 214 瀏覽
添加回答
舉報