C# 欄位與屬性

March 27, 2024

在 C# 中,屬性和欄位都可以用來儲存資料,其中有哪些差異呢?它們使用的時機為何?

欄位 Field

用來儲存狀態或計算結果,可以根據 public, protected, private 等存取修飾詞設定欄位的可見範圍。

public class Customer
{
    public string name;
    private int _money;
}

屬性 Property

一樣可以用來儲存狀態或計算結果,不過可以加上存取子,用以限制取得 (get) 或設定 (set) 的範圍;此外也可以存取子內加入設定或取得時須執行的邏輯。

public class Customer
{
    private string? _name;
    private int _money;

    public string? Name // 可公開存取
    {
        get { return _name; }
        set { _name = value; }
    }

    public int Money
    {
        get { return _money; } 
        private set 
        { // 只能在 Customer 類別內設定,金額至少為 0 元
            if (value < 0) { _money = 0; }
            else { _money = value; }
        }
    }

    // 類別內的其它方法
}

什麼是自動實作屬性 ?

自動實作屬性 (Auto-Implemented Properties) 可以節省一部分的程式碼。

例如上述的 Customer 類別,就可以濃縮如下:

public class Customer
{
    public string? Name { get; set; }
    public int Money { get; private set; } // 不含金額至少為 0 元的邏輯
}

但是沒辦法在內部實作存取時的邏輯,若需要撰寫,則需使用原本的寫法。

除了精簡程式碼以外,在使用 ORM 存取資料庫、WebAPI 傳遞資料時,通常類別內的資料也使用自動實作屬性。

參考資料