屬性 (F#)

屬性可讓中繼資料套用至程式設計建構。

語法

[<target:attribute-name(arguments)>]

備註

在上述語法中,target 是選用的,若有的話,會指定屬性套用到的程式實體類型。 target 的有效值會顯示在此文件稍後提供的表格中。

attribute-name 是指有效屬性型別的名稱 (可能以命名空間限定),且可能有通常用於屬性型別名稱中的尾碼 Attribute。 例如,型別 ObsoleteAttribute 在此內容中可縮短為 Obsolete

arguments 是屬性型別之建構函式的引數。 如果屬性具有無參數建構函式,則可以省略引數清單和括弧。 屬性支援位置引數和具名引數。 位置引數是依照出現順序使用的引數。 如果屬性具有公用屬性,則可以使用具名引數。 您可以在引數清單中使用下列語法加以設定。

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

對於屬性目標 assemblymodule,您可將屬性套用至組件中的最上層 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 指出屬性支援以組件作為目標,則編譯器會將屬性套用至組件。 大部分的屬性都不會同時套用至函式和組件,但若真的如此,屬性將會套用至程式的主要函式。 如果明確指定了屬性目標,屬性將會套用至指定的目標。

雖然在一般情況下不需要明確指定屬性目標,但必要時仍可參考下表,其中顯示屬性目標的有效值以及使用範例:

屬性目標 範例
組件
[<assembly: AssemblyVersion("1.0.0.0")>]
模組
[<``module``: MyCustomAttributeThatWorksOnModules>]
return
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
field
[<DefaultValue>] val mutable x: int
property
[<Obsolete>] this.MyProperty = x
param
member this.MyMethod([<Out>] x : ref<int>) = x := 10
type
[<type: StructLayout(LayoutKind.Sequential)>]
type MyStruct =
  struct
    val x : byte
    val y : int
  end

另請參閱