如果我讓一個班級成員爲私人,然後我想要訪問該成員,那麼我們必須爲該成員定義一個公共屬性。但後來我想知道:如果我們可以通過爲其公開一個公共屬性來公開使用這個類成員,那我們爲什麼不把它定義爲public呢?爲什麼在C#中使用公有屬性來表示私有字段?
回答
屬性訪問器(get,set方法)允許你改變你的實現是未來。例如,您可以從後臺字段(私有類成員)開始,但稍後該屬性可能會成爲某些計算的結果。此外,屬性語法允許您擁有隻讀成員 - 因此您只能在類中更改該值,外部世界只能讀取它。
此參數使得只讀屬性成爲可能 - 但不能讀取/寫入。如果您後來發現需要屬性,因爲它變成了計算值,那麼您仍然可以引入該屬性。 – Timwi 2010-08-27 05:17:37
由於二進制兼容性的原因,Microsoft建議使用公共屬性代替公共屬性。如果你正在編寫一個庫(其他程序可以訪問),這只是一個問題。
基本上,想象一下這樣的場景:
- 您創建一個帶有一個公共領域
- 別人編寫使用您的庫並訪問公共領域
- 現在你想一個程序因爲您需要驗證輸入值,或者該屬性已經成爲計算的結果,或者您希望它由於過時或其他原因而引發異常,所以請將您的字段更改爲公共屬性。
- 用戶嘗試升級您的庫,但不是使用庫的程序。
這將完全破壞程序 - 它將停止工作,只會崩潰。但是,如果您不是從一開始就擁有公共財產的領域,那麼您可以交換圖書館。
這當然只適用於圖書館。在其他所有情況下,建議並不相關,如果您願意,您可以使用字段。如果您後來發現您需要一個屬性,那麼您仍然可以將其更改爲屬性,然後您的程序仍然可以正常編譯。
非常好的解釋。 – Hari 2013-10-29 12:32:32
以下是爲什麼我們使用公共屬性而不是公共字段的一些原因。
- 可以在 get/set方法編寫更復雜的代碼,而只有在 領域的一個值。
- 屬性使您的代碼更多 「OO」。說一個叫Person的類,我們 可以很容易猜到它裏面有一個名爲「Name」的 屬性。但名爲「名稱」的 公有字段實際上是 很奇怪。
- 某些屬性僅適用於屬性 (AttributeTargets.Property)。
使用屬性的原因非常簡單。您可以隨時更改代碼處理獲取/設置它的值,而不會根據您的工作打破任何外部程序 - 這不適用於字段。此外,屬性可以被標記爲虛擬的,因此可以由子類重新定義 - 而不會破壞任何兼容性。
- 1. C#保護字段私有,添加屬性 - 爲什麼?
- 2. 爲什麼可以從屬性訪問私有常量字段?
- 3. 爲什麼私有靜態屬性爲
- 4. 爲什麼不公開所有字段/屬性/方法?
- 5. 屬性使用在C私有方法++
- 6. 模型中有很多字段,但想擁有所有這些字段的公有/私有屬性
- 7. 在私有和公共const屬性中使用XmlSerializer
- 8. 在公共屬性獲取器中使用私有變量
- 9. 是否有任何理由在C#中使用私有屬性?
- 10. 應該在什麼情況下使用公共字段來代替屬性?
- 11. 爲什麼字段和屬性在C#中稱爲位置?
- 12. 在Objective-C中,什麼命名約定顯示屬性是私有的?
- 13. 爲什麼表單屬性中有'#'
- 14. 如何在VB.NET中使用部分類公開私有字段?
- 15. Objective-C屬性公開只讀,但有一個私有setter
- 16. 使用反射C在私有字段中調用公共函數#
- 17. 公有類的私有屬性是否安全在DLL中
- 18. 字節碼 - 公有和私有屬性差異
- 19. EF 4.0 - 使用私有字段映射到只讀屬性
- 20. 如果我的類有一個存儲私有字段的屬性,我應該使用私有字段還是屬性在構造函數中初始化它?
- 21. 有沒有什麼辦法來檢查類的屬性在C#
- 22. 爲什麼我們分別使用公共和私有變量
- 23. 你可以在C#中使用沒有字段的屬性嗎?
- 24. 如何在公共方法中使用私有方法來檢查有效性?
- 25. 在私有字段中使用F#類中的屬性雙重內存嗎?
- 26. 爲什麼有些領域是公共的,有些是屬性?
- 27. 有什麼辦法來知道什麼屬性/字段包含一些價值?
- 28. PHP |爲什麼我應該使用公共靜態/私有靜態函數而不是公共/私有函數?
- 29. ColdFusion 9 CFScript私有屬性和公共屬性
- 30. C#私有屬性 - 他們使用/有意義嗎?
你在問什麼?那(單個句子)是無法解讀的。 – tster 2010-08-27 05:12:16
我已經大量編輯它。我認爲這就是他的意思。 – Timwi 2010-08-27 05:15:33
我認爲最後一句話「...首先是私人的」應改爲「......首先爲公衆」。 – 2010-08-27 05:21:18