回答
在我的書中,擴展屬性的#1最重要的原因是圍繞無主代碼實現流暢的接口模式。我內置周圍NHibernate會話的包裝,使之更加intitutive用,所以我可以做類似的邏輯來
public bool IsInTransaction
{
get { return _session.Is().Not.Null && _session.Is().InTransaction; }
}
這看起來很愚蠢的是必須有一個方法來工作,因爲沒有辦法,我插作爲一個屬性,除非我直接修改會話對象的來源。
由於屬性只是方法的語法糖,我不明白爲什麼C#應該有擴展方法沒有擴展屬性。
我不知道爲什麼不。屬性只是帶有不同語法的getter/setter方法。
我想這將是巨大的,只要有沒有或很少性能損失的使用它們。
肯定會在我們的處置添加到工具的劇目。
現在作爲我的意見,是他們應該,但像什麼,開發人員需要正確地需要以及何時使用它。像大多數新功能一樣,許多開發人員在不充分了解它們的情況下使用它們,以及何時/如何/如何/如何最好地使用它們。我知道我有時也會被吸入。
但是,當然,帶上它。我可以看到自己在某些情況下
使用它,我猜索引屬性將是其中一大包顯著增強,我們將在4.0可以看到的僅僅是一個聖誕襪。
我不認爲擴展屬性幾乎是有用的。我發現自己主要使用屬性來封裝字段(經典的get; set;)或者提供只讀的好處(只需要獲取私有的,只讀的,構造器集字段)。由於擴展程序無法訪問私人成員,因此我並不認爲這一點,特別是對於「設置」。做任何事情,「設定」;無論如何只需要調用其他方法。然後你遇到拋出異常的屬性問題。
由於擴展僅限於使用公共屬性和方法,因此我發現閱讀使用實用程序類的代碼更簡潔更容易。當涉及到它時,我們使用擴展方法使LINQ看起來很漂亮。爲了防止開發人員做錯事,我可以在LINQ中處理一個額外的(),並堅持只是擴展方法。
關鍵是不處理額外(),與任何其他語法糖相同的點 – alpav 2010-01-05 19:02:36
沒有,屬性僅僅是一個隱藏什麼真正被用於生成的代碼的方式。如果你看看反映代碼或IL你可以決定你真正得到它是:
public string MyProperty { get; set; }
成爲
public string get_MyProperty(){ return <some generated variable>; }
public string set_MyProperty(string value) { <some generated variable> = value; }
這只是2種方法。
你不能綁定到get_MyProperty() – recursive 2010-01-05 19:26:03
似乎它可能很容易被誤用。正如其他人所說的,C#屬性只是方法的語法糖。但是,將這些作爲財產實施具有一定的內涵:訪問不會產生副作用,修改財產應該非常便宜。後一點是至關重要的,因爲它看起來像擴展屬性幾乎總是比傳統屬性更昂貴。
這是關於數據綁定,比方說我有一個綁定到我的用戶界面的對象,我想隱藏基於對象的其他屬性來顯示它。我可以爲IsVisible或Visibility添加擴展屬性,並將該屬性綁定到UI。
您無法綁定擴展方法,但可以將數據綁定的屬性添加到您無法擴展的現有類型,這可能非常有用。
開發人員應該使用屬性來組織名稱的層次結構,並避免使用駝峯大小寫或下劃線進行名稱連接。例如,而不是HttpUtility.UrlDecode,它們應該擴展字符串類以使用類似「some str」.decode.url 目前,在C#中執行此操作的唯一方法是:「some str」.decode()。url
會是一件好事,但我看到很多人說他們希望用於數據綁定,因爲它使用反射,所以這是不可能的。
是的,請。
而且還添加索引屬性和STATIC擴展的東西,因爲我嚴重希望爲System.Console(這不意味着作爲一個笑話!)。
- 1. 我應該擴展ArrayList以添加非空的屬性嗎?
- 2. 將SQL Server擴展屬性添加到EF 4.0模型
- 3. C#的DateTime添加屬性,而不擴展方法
- 4. 通過添加屬性來擴展屬性
- 5. 擴展屬性
- 6. 使用類擴展將ivar和屬性添加到類
- 7. 添加和刪除擴展屬性到AD對象
- 8. 將屬性添加到/擴展索納塔媒體實體
- 9. 如何通過類別擴展添加屬性到NSMutableArray?
- 10. 通過mvc添加自定義屬性到字段驗證屬性擴展
- 11. C#屬性會影響C#擴展或輸出嗎?
- 12. 我應該在原型中添加* internal *屬性嗎?
- 13. 我應該添加DataMember屬性來重寫派生類中的屬性嗎?
- 14. 我應該使用GHC Haskell擴展嗎?
- 15. 擴展方法和擴展屬性是不好的做法嗎?
- 16. 擴展屬性Kotlin
- 17. CSS屬性擴展
- 18. C#/ XNA擴展設置實例屬性
- 19. C#擴展方法與特定屬性
- 20. C#EWS更改擴展屬性的MapiPropertyType
- 21. 我應該將外鍵的公共屬性添加到我的表中嗎?
- 22. 我應該將Pod添加到VCS嗎?
- 23. 使用附加屬性擴展類
- 24. 刪除WF 4.0持久性擴展
- 25. 在擴展中的弱屬性上添加didSet觀察器
- 26. 使用MicrosoftGraph SDK如何向用戶添加擴展屬性
- 27. Uncaught TypeError:無法添加屬性12,對象不可擴展
- 28. 使用Google日曆API添加和檢索擴展屬性
- 29. 角:無法添加屬性resumeBootstrap,對象是不可擴展
- 30. 通過Power Shell向Azure ActiveDirectory用戶添加擴展屬性
發現這個有趣的博客文章由Eric Lippert的主題http://blogs.msdn.com/ericlippert/archive/2009/10/05/why-no-extension-properties.aspx – Jon 2009-10-09 20:53:12
不要讓該鏈接得到敏捷的傳道者,他們會把ROTFLOL變成最好的古怪風格。你在功能上投入了大量工作,並且只有在你從主要消費者那裏得到反饋後,你纔會猜測發生了什麼? – 2010-01-11 17:09:48