在鐵人賽DAY 25 Type提到一個問題,存取子的設定會影響 GetProperties 所傳回的結果,但我有些觀念沒有釐清,所以寫這篇文章記錄一下。
屬性(Property)與欄位(Field)都是物件的資料成員,欄位添加存取子則成屬性。
欄位通常的修飾都是私有(Private),只有開放給物件內部使用,對外則不開放。除非是定義一個常數(const)或是固定的變數(readonly),才會將修飾設為公開(Public),避免失去物件封裝的意義,也會危及資料的安全。
屬性不能當變數使用,所以不能將屬性當做 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)