從我可以告訴,屬性用於提供accessor方法esque功能;然而,它們是以正常的方法繼承行爲爲代價的。使用屬性與傳統的setter/getter方法相比有什麼優勢?屬性和訪問器方法的優缺點是什麼?C# - 屬性與訪問器方法?
1
A
回答
1
我想你可能會感到困惑。在你的例子中,上述方法應該可以訪問。例如,給定這組類型,下面應該工作:
public class Base
{
public virtual int Datum { get; set; }
}
public class Derived : Base
{
public override int Datum
{
get { return 12; }
// set method remains as normal, with just the get overriden
}
public void SetDatumMethod(int newValue)
{
Datum = newValue; // Datum as a property is still accessible
}
}
派生類依然繼承財產。屬性實際上只是C#中的語法糖(主要是),因爲編譯器在後臺爲您生成set_Datum(int x)
和get_Datum()
方法。如上所示,屬性get/set方法仍然可以單獨覆蓋。
使用屬性的優點是它們具有額外的語義含義;它們以某種方式「包含」或「代表」數據,而不是用於生成數據的方法。
0
Visual Studio調試器在觀察對象時執行getter方法。也就是說,屬性訪問器在不可預知的時間執行,因此不應引起任何可辨別的副作用。濫用屬性會導致難以解決的問題。
使用方法的另一個原因是訂單檢索可能被參數化。
一個很好的做法是,財產訪問計算便宜;不應強制客戶端代碼將屬性值放入局部變量中 - 這是過早的優化。
+0
你是指「濫用財產」?你能更具體地瞭解什麼構成濫用和潛在的結果錯誤?此外,什麼是「訂單檢索」,你能更具體地說明爲什麼「參數化訂單檢索」比任何「訂單檢索」特性使用的更好?最後,我不明白當你建議以「計算便宜」的方式進行財產訪問時你的意思。在什麼情況下,客戶端代碼會被強制將屬性值放入局部變量中?你能提供這些場景的例子嗎? – weberc2
相關問題
- 1. 無法訪問LINQ屬性與C#
- 2. C#屬性無法訪問
- 3. 無法訪問屬性C++
- 4. 訪問屬性:方法
- 5. 沒有成員在屬性和訪問器方法objective-c
- 6. 訪問屬性 - C#
- 7. NSObject無法訪問屬性和方法
- 8. js:方法無法訪問屬性
- 9. Spring安全性 - 基於屬性訪問控制器方法
- 10. 訪問Groovy屬性或方法
- 11. Flex ArrayCollection - 訪問對象方法/屬性?
- 12. 使用nghandsontable訪問handsontable方法/屬性
- 13. 訪問包裹方法屬性
- 14. Javascript從子方法訪問父屬性
- 15. UIBarItem - 作爲方法/屬性訪問customView
- 16. javascript:屬性和方法訪問對象
- 17. 訪問父級方法和屬性PHP
- 18. 訪問類方法中的屬性?
- 19. Cocos2d訪問場景屬性和方法
- 20. 訪問Rust中訪問屬性後調用方法
- 21. 縮寫屬性訪問器?
- 22. 無法獲取訪問器方法中的屬性 - laravel雄辯
- 23. 方法方法屬性訪問方法邊界
- 24. C# - 訪問XML屬性
- 25. 訪問自動屬性 - C#
- 26. Qt的C++訪問屬性
- 27. 訪問Id屬性與jQuery
- 28. C#方法屬性
- 29. 跨配方訪問屬性
- 30. 如何打印屬性訪問器的值時,屬性訪問器具有相同的名稱,方法
您的第一個示例編譯並運行得很好。 – dtb
您仍繼承這些成員,只是在派生類中指定要查詢「Datum」屬性時,您需要指定要訪問Datum的基類實現('base.Datum = 2 ') - 雖然我確定它應該可以工作,無論(當你重載Datum並且仍然想要查詢基本實現時你肯定需要使用超類訪問器) – Charleh
嗯,出於某種原因,在一個項目下,我得到錯誤,但把它放在一個新的項目中運行良好。我的錯。 – weberc2