在鐵人賽DAY 25 Type提到一個問題,存取子的設定會影響 GetProperties 所傳回的結果,但我有些觀念沒有釐清,所以寫這篇文章記錄一下。

  1. 屬性(Property)與欄位(Field)都是物件的資料成員,欄位添加存取子則成屬性。

  2. 欄位通常的修飾都是私有(Private),只有開放給物件內部使用,對外則不開放。除非是定義一個常數(const)或是固定的變數(readonly),才會將修飾設為公開(Public),避免失去物件封裝的意義,也會危及資料的安全。

  3. 屬性不能當變數使用,所以不能將屬性當做 ref 或 out 參數來傳遞,而欄位可以。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void Main(string[] args)
{
MyClass myClass = new MyClass() { myProperty = "p1", myField2 = "f2", myProperty2 = "p2" };

func1(ref myClass.myProperty); // 屬性無法被歸類為變數,編譯時期就會出錯。
func1(ref myClass.myField2);

void func1(ref string str)
{
str = str + "1";
}
}

public class MyClass
{
private string myField;

public string myField2;

public string myProperty { get { return myField; } set { myField = value; } }

public string myProperty2 { get; set; }
}

當初會有疑問是不曉得欄位的存在,以至於在使用 GetProperties 時發現沒加存取子的資料成員不會被列出來,之後看到 GetFields 方法才意識到這問題,但也不建議使用 GetFields 來獲得資料成員,因為欄位通常都是私有的,你也看不太到內容。

參考資料

mrkt 的程式學習筆記: 屬性(Property) 與 欄位(Field)