這並不完全。真正的規則是:
定義所有成員的限制,因爲他們可以是。
因此,如果它可以是private
然後它是private
。否則,如果它必須是internal
或protected
工作,那麼它分別是internal
或protected
。否則,如果它必須protected internal
工作,那麼它是protected internal
。否則,它是public
,因爲它必須是public
才能正常工作(程序集之外的東西不會從它繼承它將不得不訪問它)。
現在,所有這一切說,通常我們會主要有private
字段和大多數public
屬性。
讓我們來考慮一下我們是否有public
字段。這是有效的,將工作,甚至在非常有限的情況下甚至是有用的。但它也更脆弱。擁有它public
可以讓任何其他代碼將它設置爲任何值,不管多麼愚蠢。沒關係,因爲當我們創建一個字段public
時,我們說「沒有愚蠢的值」。*
但是,如果我們突然意識到存在一些愚蠢的值,或者我們需要在每次字段更改時都要做某件事,或者我們需要使用一些僅限財產的數據綁定。在這裏我們將不得不把這個領域變成一個財產,這是一個突破性的變化;任何使用這個類的代碼都必須重新編譯,如果我們是唯一使用這個類的人,但是如果它在一個正在被其他人使用的庫中,這並不是什麼大事。
如果它一直然而屬性,那麼我們剛剛不得不把一個自動財產{ get; set; }
與自定義實現{ get { /* do stuff and return value */ } set { /* do stuff */ } }
的屬性。從課外,看起來沒有什麼變化,我們沒有破壞任何東西。
因此,99.99%的時間,如果你打算做一個字段public
你最好在那裏使用一個屬性,以防萬一。另一方面,如果我們有一個private
屬性沒有邏輯,那麼getter和setter方法不會給我們帶來任何好處。不會有任何費用,但它們毫無意義。所以我們只需要使用一個字段。如果我們最終不得不在未來使用私有財產,那將是無關緊要的,因爲唯一需要重新編譯的代碼就是所討論的類,而且我們正在重新編譯它。
因此,我們以幾乎所有字段爲private
並且幾乎所有不具有任何定製邏輯的屬性爲protected
或public
的情況結束。
*或者它是一個private
或internal
類,我們從外面不能將它設置爲一些愚蠢的承諾,但它是更好地執行承諾比,如果你可以讓他們。
寫在mockable和可測試的方式你不這樣做,因爲* *他們「類成員」或「屬性」(順便說一下,屬性也是成員,將它們分組爲靜態成員和實例成員更爲典型)。你通常想封裝實際的實現,所以當你訪問它們時沒有綁定邏輯的字段通常是私有的,而你可以同時控制寫入訪問(誰寫入)和綁定邏輯的屬性(當你寫)更經常公開。你想控制你的類型的公共表面,並隱藏實際的實現。 –
沒有什麼強制你使用一個字段作爲私有或者屬性作爲公共的,但是通常變量是私有的,因爲這些類是內部使用的,屬性用於外部使用,因爲它們可以在get/set時執行代碼。 – Gusman
此解決方案可能會清除您的情況:http://stackoverflow.com/questions/295104/what-is-the-difference-between-a-field-and-a-property-in-c http://softwareengineering.stackexchange .com/questions/133015/private-variable-vs-property –