2010-02-22 28 views

回答

8

屬性在編譯時作爲元數據輸出到程序集。這個元數據然後通過反射在運行時使用 - 例如使用GetCustomAttributes()

編譯器在編譯時也使用了一些屬性。例如,編譯器查看AttributeUsageAttribute以確定某個屬性是否可用於特定對象。

+1

編譯器在編譯器時也使用ObsoleteAttribute。 – plinth 2010-02-22 15:18:36

1

屬性在編譯時編譯到代碼中,但它們通常在運行時用作觸發器以不同方式執行操作。

0

編譯器將所謂的元數據添加到裝飾有屬性的對象。此元數據無論是通過屬性還是以其他方式創建,都可以在運行時通過Reflection訪問。因此,您可以使用屬性進行修飾,然後在程序運行時讀取詳細信息。但是,要說元數據在編譯時被「使用」並不完全正確,因爲編譯器不關心元數據是什麼。

+1

-1:在某些情況下,屬性會以有意義的方式影響編譯。例如,條件屬性主要用於編譯期間,如果使用不正確,可能會觸發編譯器錯誤。 – Brian 2010-02-22 19:34:18

+0

是的,你是對的......我忘記了這些情況......過時是另一回事。 – 2010-02-22 20:53:19

12

大多數僅在運行時使用。非常有限數目的由編譯器使用,包括:

  • [Conditional(...)] - 忽略每生成符號的方法調用
  • [Obsolete(...)] - 發出一個警告/誤差作爲構建輸出
  • [Serializable] - 被寫入作爲一個CLI標誌
  • [Extension] - 用於擴展方法
  • [AttributeUsage] - 影響的屬性是如何應用
  • -

編譯器在創建程序集文件時使用了諸如[AssemblyVersion],[AssemblyFileVersion]等的一系列內容,以及諸如影響可訪問性的[InternalsVisibleTo]之類的內容。

此外,像PostSharp這樣的工具可以根據屬性做額外的後期編譯步驟。

編譯器可能會向生成的類型/方法(anon-methods/types,iterator塊等)添加一些其他屬性。

相關問題