今日敲代碼時,突然感覺對類的屬性封裝、字段有點犯迷糊了。。連基礎的都不知道了,那敲的代碼怎么能嚴謹高效的。果斷拿起各種高級編程、大全啥的翻起來~~這不再把自己的理解寫下來(定義都是直接抄書的),獻給同樣迷糊的小伙伴。
先說下類的成員,它分為數據成員和函數成員。數據成員,簡單點可以理解成類的數據,包含了字段、常量(const)、事件;函數成員,就是操作類中的數據,包含方法、屬性、構造函數、終結器(析構函數)、運算符、索引器。(就提一下,方便后面說下去,要都解釋就偏題了)字段就是類里定義的變量,而屬性則是字段的拓展。所以在使用屬性前要結合一個正常的字段聲明,這個字段稱為屬性的后備字段(backing field):
1 private int numberOfCows; 2 public int NumberOfCows 3 { 4 get 5 { 6 return numberOfCows; 7 } 8 set 9 { 10 numberOfCows = value; 11 BagOfFeed = numberOfCows * FeedMultiplier; 12 } 13 }
讀取NumberOfCows字段時會運行get方法,返回私有字段numberOfCows。而設置NumberOfCows字段時,會調用set方法,看上去這個方法沒有參數,其實value就是它的參數,其中包含為這個字段設置的值。其實這就是用屬性來對字段進行封裝(這就是封裝啦)。
使用封裝還可以實現對屬性的只讀、只寫:
1 public string Name { get; private set; }//只讀 2 public string Name { private get; set; }//只寫
這樣寫屬性時,編譯器會自動創建private string name。這種是會自動實現后備成員變量的自動實現屬性。
如果是:
1 public string Name { get; set; }
這樣的沒有啥限定的屬性,其實和公有字段沒多大區別了。
但是從面向對象的角度來講,公開的是方法,而不是字段哦。而且微軟也推薦:所有的字段都設置為私有字段,如果要使用它們,則把它們封裝成屬性。對於這樣簡單的set或get,編譯器會自動進行inline處理,沒有函數進出棧的性能損失。所以還是建議不要用公有字段了,給字段穿件衣服吧~~