在.Net中,是編譯時還是運行時使用的屬性特性?你能舉幾個例子嗎?在編譯時或運行時使用.Net屬性特性還是兩者都使用?
回答
屬性在編譯時作爲元數據輸出到程序集。這個元數據然後通過反射在運行時使用 - 例如使用GetCustomAttributes()
。
編譯器在編譯時也使用了一些屬性。例如,編譯器查看AttributeUsageAttribute
以確定某個屬性是否可用於特定對象。
屬性在編譯時編譯到代碼中,但它們通常在運行時用作觸發器以不同方式執行操作。
編譯器將所謂的元數據添加到裝飾有屬性的對象。此元數據無論是通過屬性還是以其他方式創建,都可以在運行時通過Reflection訪問。因此,您可以使用屬性進行修飾,然後在程序運行時讀取詳細信息。但是,要說元數據在編譯時被「使用」並不完全正確,因爲編譯器不關心元數據是什麼。
-1:在某些情況下,屬性會以有意義的方式影響編譯。例如,條件屬性主要用於編譯期間,如果使用不正確,可能會觸發編譯器錯誤。 – Brian 2010-02-22 19:34:18
是的,你是對的......我忘記了這些情況......過時是另一回事。 – 2010-02-22 20:53:19
大多數僅在運行時使用。非常有限數目的由編譯器使用,包括:
[Conditional(...)]
- 忽略每生成符號的方法調用[Obsolete(...)]
- 發出一個警告/誤差作爲構建輸出[Serializable]
- 被寫入作爲一個CLI標誌[Extension]
- 用於擴展方法[AttributeUsage]
- 影響的屬性是如何應用 -
編譯器在創建程序集文件時使用了諸如[AssemblyVersion]
,[AssemblyFileVersion]
等的一系列內容,以及諸如影響可訪問性的[InternalsVisibleTo]
之類的內容。
此外,像PostSharp這樣的工具可以根據屬性做額外的後期編譯步驟。
編譯器可能會向生成的類型/方法(anon-methods/types,iterator塊等)添加一些其他屬性。
- 1. app.config僅在編譯時使用,還是在運行時需要?
- 2. C++編譯時和運行時可用的名稱屬性
- 3. 編譯器或運行時Install4J屬性/變量
- 4. 平臺特定庫的運行時間還是編譯時間?
- 5. C# - 在運行時確定屬性是Type還是Object實例?
- 6. 在運行時更改.NET屬性網格只讀屬性
- 7. 在運行時編譯並使用類
- 8. 編譯時傳遞給運行時客戶端GWT的屬性?
- 9. 在運行時編輯i18屬性
- 10. 編譯時間多態性與運行時多態性
- 11. 運行時間依賴性與編譯時間依賴性
- 12. 使用sqlite3時編譯錯誤:具有'retain(或strong)'屬性的屬性必須是對象類型
- 13. 是否可以使用ExpandoObject創建運行時屬性?
- 14. 自定義屬性或特殊屬性還是這種模式?
- 15. 得到在編譯時(或運行時)
- 16. 使用spring-boot時是否可以使用spring-boot命令行屬性:運行?
- 17. 運行時間編譯VS時間(.NET)
- 18. SASS/SCSS - 簡單`顯示:none`屬性,都會在編譯時炒
- 19. 什麼是運行時間和編譯時間多態性?
- 20. 用戶定義文字是在編譯時還是運行時解決的?
- 21. 它是編譯時多態還是運行時?
- 22. 是泛型運行時還是編譯時多態?
- 23. 使用反射在運行時創建類型的屬性上添加屬性
- 24. 使用DataContractSerializer時忽略運行時的一些屬性
- 25. 運行時的FireMonkey屬性編輯器
- 26. 使用名稱空間會影響性能還是編譯時間?
- 27. 是否可以在運行時修改屬性的屬性?
- 28. 編譯錯誤。使用屬性struct
- 29. 使用EF查詢編譯時未知屬性
- 30. 使用編譯時安全從C++更改QML屬性
編譯器在編譯器時也使用ObsoleteAttribute。 – plinth 2010-02-22 15:18:36