2008-09-26 93 views
17

我想要流暢的界面。例如,請參閱this Channel9的討論。可能require也會添加索引屬性。擴展屬性應該添加到C#4.0嗎?

你的想法是什麼?這些優勢是否會超過「語言混亂」?

+3

發現這個有趣的博客文章由Eric Lippert的主題http://blogs.msdn.com/ericlippert/archive/2009/10/05/why-no-extension-properties.aspx – Jon 2009-10-09 20:53:12

+0

不要讓該鏈接得到敏捷的傳道者,他們會把ROTFLOL變成最好的古怪風格。你在功能上投入了大量工作,並且只有在你從主要消費者那裏得到反饋後,你纔會猜測發生了什麼? – 2010-01-11 17:09:48

回答

6

在我的書中,擴展屬性的#1最重要的原因是圍繞無主代碼實現流暢的接口模式。我內置周圍NHibernate會話的包裝,使之更加intitutive用,所以我可以做類似的邏輯來

public bool IsInTransaction 
{ 
    get { return _session.Is().Not.Null && _session.Is().InTransaction; } 
} 

這看起來很愚蠢的是必須有一個方法來工作,因爲沒有辦法,我插作爲一個屬性,除非我直接修改會話對象的來源。

29

由於屬性只是方法的語法糖,我不明白爲什麼C#應該有擴展方法沒有擴展屬性。

3

我不知道爲什麼不。屬性只是帶有不同語法的getter/setter方法。

1

我想這將是巨大的,只要有沒有或很少性能損失的使用它們。

0

肯定會在我們的處置添加到工具的劇目。

現在作爲我的意見,是他們應該,但像什麼,開發人員需要正確地需要以及何時使用它。像大多數新功能一樣,許多開發人員在不充分了解它們的情況下使用它們,以及何時/如何/如何/如何最好地使用它們。我知道我有時也會被吸入。

但是,當然,帶上它。我可以看到自己在某些情況下

0

使用它,我猜索引屬性將是其中一大包顯著增強,我們將在4.0可以看到的僅僅是一個聖誕襪。

2

我不認爲擴展屬性幾乎是有用的。我發現自己主要使用屬性來封裝字段(經典的get; set;)或者提供只讀的好處(只需要獲取私有的,只讀的,構造器集字段)。由於擴展程序無法訪問私人成員,因此我並不認爲這一點,特別是對於「設置」。做任何事情,「設定」;無論如何只需要調用其他方法。然後你遇到拋出異常的屬性問題。
由於擴展僅限於使用公共屬性和方法,因此我發現閱讀使用實用程序類的代碼更簡潔更容易。當涉及到它時,我們使用擴展方法使LINQ看起來很漂亮。爲了防止開發人員做錯事,我可以在LINQ中處理一個額外的(),並堅持只是擴展方法。

+0

關鍵是不處理額外(),與任何其他語法糖相同的點 – alpav 2010-01-05 19:02:36

-3

沒有,屬性僅僅是一個隱藏什麼真正被用於生成的代碼的方式。如果你看看反映代碼或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種方法。

+0

你不能綁定到get_MyProperty() – recursive 2010-01-05 19:26:03

1

似乎它可能很容易被誤用。正如其他人所說的,C#屬性只是方法的語法糖。但是,將這些作爲財產實施具有一定的內涵:訪問不會產生副作用,修改財產應該非常便宜。後一點是至關重要的,因爲它看起來像擴展屬性幾乎總是比傳統屬性更昂貴。

9

這是關於數據綁定,比方說我有一個綁定到我的用戶界面的對象,我想隱藏基於對象的其他屬性來顯示它。我可以爲IsVisible或Visibility添加擴展屬性,並將該屬性綁定到UI。

您無法綁定擴展方法,但可以將數據綁定的屬性添加到您無法擴展的現有類型,這可能非常有用。

0

開發人員應該使用屬性來組織名稱的層次結構,並避免使用駝峯大小寫或下劃線進行名稱連接。例如,而不是HttpUtility.UrlDecode,它們應該擴展字符串類以使用類似「some str」.decode.url 目前,在C#中執行此操作的唯一方法是:「some str」.decode()。url

1

會是一件好事,但我看到很多人說他們希望用於數據綁定,因爲它使用反射,所以這是不可能的。

0

是的,請。

而且還添加索引屬性和STATIC擴展的東西,因爲我嚴重希望爲System.Console(這不意味着作爲一個笑話!)。