屬性(Property)與欄位(Field)的差別

 

一、屬性(Property)與欄位(Field)的差別

圖一、欄位(Field)

 

圖二、屬性(Property)

 

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            p.FirstName = "Bill";
            p.lastName = "Tom";
        }
    }

    public class Person
    {
        public string FirstName
        {
            get { return firstName; }
            set { firstName = value; }
        }
        private string firstName;
        public string lastName;
    }
}

有時候我們會遇到一個類別有時會用到屬性或欄位,但這兩者似乎沒有什麼不同。但其實是有的,

field 是單純的變數,可用 const、readonly 修飾詞,

但是 field 不能使用 virtual、override、sealed、abstract 等修飾詞。

property 是可以提供完整控制的變數,例如讀寫時能根據需要進行驗證或計算的工作。

在實作時,property 常為公用,並控制著一個私用的欄位。

 

二、

以下為對 property 特性進一步說明

1、在 C# 3.0,如下範例,又叫做 Auto-Implemented Properties

public class Person
{
    public string FirstName { get; set; };
}

 

2、對 property 實作 getter 與 setter,注意 setter 裡的 value 是 setter 獨有的關鍵字,

表示餵進來的參數值。

public class Person
{
    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }
    private string firstName;
}

 

3、在 C# 6.0,可以對一 property 給一個預設值

public class Person
{
    public string FirstName { get; set; } = string.Empty;
}

 

4、在 C# 6.0,當一個 property 唯一使用 expression body definition 的寫法時,則表示該 property 只實作 getter,

也表示他是個 Read-only properties

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            Console.WriteLine(p.FullName);
        }
    }

    public class Person
    {
        public string FullName => $"test";
    }
}

 

5、在 C# 7.0,使用 Expression-bodied members 的寫法 來改寫 getter 與 setter

public class Person
{
    public string FirstName
    {
        get => firstName;
        set => firstName = value;
    }
    private string firstName;
}

 

參考資料:

屬性(Property) 與 欄位(Field)