2009-11-06 52 views
6

我一直在尋找一個內置的屬性來指定一個類型是不可變的,我發現只有 System.ComponentModel.ImmutableObjectAttributeImmutableObjectAttribute是如何使用的?

使用反射器,我檢查它的使用位置,似乎唯一使用它的公共類是System.Drawing.Image ... WTF?它可以用於字符串,int或任何基本類型,但Image肯定是而不是不可變,有很多方法可以改變其內部狀態(例如使用Graphics或Bitmap.SetPixel方法)。

因此,BCL中唯一明確聲明爲不可變的類, mutable!或者我錯過了什麼?

回答

8

的文檔狀態:

該屬性在 屬性窗口通常用於確定 是否呈現可膨脹對象 爲只讀。因此,此屬性 僅在設計時使用。

反射器顯示使用此屬性的唯一方法是設計屬性網格使用的內部System.Windows.Forms.PropertyGridInternal.GridEntry.Flags屬性獲取器。

3

我想你的ImmutableObjectAttribute混淆使用 - 這意味着該對象的屬性不應該是這樣的形式設計或類似的設計時UI編輯,對象是本身不變。

這個屬性可能是爲每日WTF的候選人,但是......

+1

「不是該對象本身是不可變的」 - 文檔指定該屬性「指定對象沒有能夠被編輯的子屬性」。看來你所說的與文檔相矛盾。你能解釋一下嗎? – MasterMastic 2013-05-23 01:57:28

+0

@Ken,這個屬性意味着當使用*屬性編輯器*時,對象沒有要編輯的子屬性*,就像Visual Studio的表單設計器中的屬性一樣。不管這個屬性如何,這些屬性仍可以從代碼中設置或修改。根據當前的文檔,我的重點是:「這個屬性通常用於*屬性窗口*中,以確定是否將可擴展對象呈現爲只讀,因此,此屬性僅在設計時使用*。 「 – 2013-05-23 08:02:52

2

看看在ImmutableObjectAttribute的文檔:「指定的對象不具有能夠被編輯的子屬性...這個屬性通常用於在「屬性」窗口中確定是否將可展開對象呈現爲只讀,因此此屬性僅在設計時使用。「所以這個屬性並不是關於不可變性的:它是關於像PropertyGrid這樣的編輯器中禁用子屬性的顯示/可編輯性的。

因此,圖像沒有被聲明爲不可變的,而不是Int32作爲可變的。 Int32不需要ImmutableObjectAttribute,因爲它無法擴展。圖像有它,因爲它可以擴展,但不是如此有用。這只是一個真正令人誤解的名字。

相關問題