2012-02-06 129 views
12

由於屬性實際上只是元數據附加到程序集,這是否意味着屬性對象只能根據請求創建(例如,當您調用GetCustomAttributes時)?何時創建屬性對象?

或者它們是在創建對象時創建的嗎?

或者,由於CLR的屬性掃描而創建對象時創建的前2個的組合?

+0

相關相關:[.NET屬性:爲什麼GetCustomAttributes()每次都創建一個新的屬性實例?](http://stackoverflow.com/q/417275/319403)。考慮到甚至可能回答你的問題。 – cHao 2012-02-06 20:57:01

+0

它在某種程度上做到了。真正的問題對我來說並不是真正的問題,但中間是答案。 CLR書籍中的經文也很好(通過@Smi)。 – Dann 2012-02-07 10:20:50

回答

8

從CLR通過C#,第三版:

如果你想構建一個屬性對象,必須調用要麼GetCustomAttributesGetCustomAttribute。每次調用其中一個方法時,它會構造指定屬性類型的新實例 ,並根據源代碼中指定的值設置實例的每個字段和屬性。這些方法返回對應用屬性類的完全構造實例的引用。

所以,他們只是根據要求創建的。

4

它們根據要求創建。例如,如果將某些.NET 3.0屬性添加到.NET 2.0程序集(例如WCF DataContractAttribute)中,則仍然可以在不具有.NET的計算機上使用.NET 2.0程序集。 3.0已安裝,前提是您沒有任何試圖訪問屬性的代碼。

2

它不是那麼幹淨,屬性也影響代碼生成。例如,某些屬性由編譯器解釋,例如[DllImport]。例如,有些被抖動發現,[MethodImpl]。這是無限地擴展到框架中的其他工具和類,這些工具和類是爲了利用屬性而編寫的。

但是,如果你想找到自己的屬性,這些工具只是在做你需要做的事情,調用GetCustomAttributes()是必需的。這種代碼從不與對象的實例關聯,屬性適用於類型。

+0

因此,那些屬於系統的屬性(「DllImport」)會保留爲元數據並且以這種方式進行解析,而不是創建並隨後使用對象? – Dann 2012-02-07 10:14:41

+1

工具實際*做的*與屬性是遍佈各地。 – 2012-02-07 10:36:11