屬性(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;
}
參考資料: