屬性(F#)
屬性可讓元數據套用至程式設計建構。
語法
[<target:attribute-name(arguments)>]
備註
在上一個語法中,目標 是選擇性的,如果存在,則會指定屬性所套用的程式實體類型。 目標 的有效值會顯示在此文件後文中顯示的資料表中。
屬性名稱 是指有效屬性類型的名稱(可能限定於命名空間),其名稱可以有或沒有用於屬性類型名稱的後綴 Attribute
。 例如,類型 ObsoleteAttribute
可以在此情境中縮短為 Obsolete
。
引數是 屬性類型建構函式的引數。 如果屬性具有無參數建構函式,則可以省略自變數清單和括號。 屬性同時支援位置自變數和具名自變數。 位置參數 指按其出現順序使用的參數。 如果屬性具有公用屬性,則可以使用具名自變數。 您可以在自變數清單中使用下列語法來設定這些專案。
property-name = property-value
這類屬性初始化可以依任何順序排列,但必須遵循任何位置自變數。 以下是使用位置自變數和屬性初始化的屬性範例:
open System.Runtime.InteropServices
[<DllImport("kernel32", SetLastError=true)>]
extern bool CloseHandle(nativeint handle)
在此範例中,屬性是 DllImportAttribute
,這裡用於縮短格式。 第一個自變數是位置參數,第二個是 屬性。
屬性是 .NET 程式設計建構,可讓稱為 屬性的物件 與類型或其他程式專案相關聯。 屬性所應用的程式元件被稱為 屬性目標。 屬性通常包含其目標的相關元數據。 在這個上下文中,元數據可以是關於類型的任何數據,而不包括它的欄位和成員。
F# 中的屬性可以套用至下列程式設計建構:函式、方法、元件、模組、類型(類別、記錄、結構、介面、委派、列舉、等),建構函式、屬性、欄位、參數、類型參數和傳回值。 在類別、表達式或工作流程表達式中,let
繫結不允許屬性。
一般而言,屬性宣告會出現在屬性目標宣告之前。 多個屬性宣告可以一起使用,如下所示:
[<Owner("Jason Carlson")>]
[<Company("Microsoft")>]
type SomeType1 =
您可以使用 .NET 反射在執行時期查詢屬性。
您可以個別宣告多個屬性,如上一個程式代碼範例所示,或者如果您使用分號分隔個別屬性和建構函式,可以在一組括弧中宣告它們,如下所示:
[<Owner("Darren Parker"); Company("Microsoft")>]
type SomeType2 =
通常遇到的屬性包括 Obsolete
屬性、安全性考慮的屬性、COM 支援的屬性、與程式代碼擁有權相關的屬性,以及指出是否可以串行化類型的屬性。 下列範例示範如何使用 Obsolete
屬性。
open System
[<Obsolete("Do not use. Use newFunction instead.")>]
let obsoleteFunction x y =
x + y
let newFunction x y =
x + 2 * y
// The use of the obsolete function produces a warning.
let result1 = obsoleteFunction 10 100
let result2 = newFunction 10 100
針對屬性目標 assembly
和 module
,您可以將屬性套用至元件中的最上層 do
系結。 您可以在屬性宣告中包含字組 assembly
或 ``module``
,如下所示:
open System.Reflection
[<assembly:AssemblyVersionAttribute("1.0.0.0")>]
[<``module``:MyCustomModuleAttribute>]
do
printfn "Executing..."
如果您省略套用至 do
系結之屬性的屬性目標,F# 編譯程式會嘗試判斷對該屬性有意義的屬性目標。 許多屬性類別都有類型為 System.AttributeUsageAttribute
的屬性,其中包含該屬性所支援之可能目標的相關信息。 如果 System.AttributeUsageAttribute
表示屬性支援函式作為目標,則該屬性應用於程式的主要進入點。 如果 System.AttributeUsageAttribute
表示屬性支援組件作為目標,則編譯器將此屬性應用於該組件。 大多數屬性不適用於函式和組件,但在適用於兩者的情況下,屬性將被套用至程式的主要函式。 如果明確指定屬性目標,則會將 屬性套用至指定的目標。
雖然您通常不需要明確指定屬性目標,但屬性中 目標 的有效值以及使用方式的範例如下表所示:
屬性目標 | 例 |
---|---|
集會 |
|
模組 |
|
方法 |
|
類 |
|
結構體 |
|
介面 |
|
列舉 |
|
構造 函數 |
|
返回 |
|
田 |
|
財產 |
|
參數 |
|
類型 |
|