共用方式為


屬性 (F#)

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

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

備註

在前面語法中,target 為選擇性,如果使用則可指定要套用屬性的程式實體類型。 本文件稍後的表格將列出 target 的有效值。

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

arguments 為屬性型別之建構函式的引數。 如果屬性有預設建構函式,即可省略引數清單和括號。 屬性支援位置引數和具名引數。 「位置引數」(Positional Argument) 是依引數出現順序所使用的引數。 如果屬性 (Attribute) 有公用屬性 (Property),就可以使用具名引數。 您可以使用下列語法,在引數清單中設定具名引數。

property-name = property-value

這類屬性初始設定的順序不拘,但必須在任何位置引數後面。 以下是使用位置引數和屬性 (Property) 初始設定的屬性 (Attribute) 範例。

open System.Runtime.InteropServices

[<DllImport("kernel32", SetLastError=true)>]
extern bool CloseHandle(nativeint handle)

在這個範例中,屬性為 DllImportAttribute (在此使用縮短的形式)。 第一個引數是位置參數,第二個是屬性。

屬性是 .NET 程式設計建構,可讓物件 (稱為「屬性」(Attribute)) 與型別或其他程式項目產生關聯。 套用屬性的程式項目稱為「屬性目標」(Attribute Target)。 屬性通常包含與其目標有關的中繼資料。 在此內容中,中繼資料可以是欄位和成員以外之型別的任何相關資料。

F# 的屬性 (Attribute) 可以套用至下列程式設計建構:函式、方法、組件、模組、型別 (類別、記錄、結構、介面、委派、列舉、聯集等)、建構函式、屬性 (Property)、欄位、參數、型別參數和傳回值。 屬性不允許在類別、運算式或工作流程運算式內使用 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")>]
do
   printfn "Executing..."

如果省略套用至 do 繫結之屬性的屬性目標,F# 編譯器會嘗試判斷對屬性有意義的屬性目標。 許多屬性類別都有 AttributeUsageAttribute 型別的屬性,其中包含該屬性可能支援的目標資訊。 如果 AttributeUsageAttribute 表示屬性支援函式做為目標,則會將該屬性套用至程式的主要進入點。 如果 AttributeUsageAttribute 表示屬性支援組件做為目標,編譯器就會將該屬性套用至組件。 大部分屬性不會同時套用至函式和組件,但在同時套用的情況下,則會將該屬性套用至程式的主要函式。 如果明確指定屬性目標,就會將屬性套用至該指定目標。

雖然您通常不需要明確指定屬性目標,但是下表會顯示屬性中 target 的有效值,以及用法範例。

屬性目標

範例

assembly

[<assembly: AssemblyVersionAttribute("1.0.0.0")>]

return

let function1 x : [<return: Obsolete>] int = x + 1

欄位

[<field: DefaultValue>] val mutable x: int

屬性

[<property: Obsolete>] this.MyProperty = x

param

member this.MyMethod([<param: Out>] x : ref<int>) = x := 10

type

[<type: StructLayout(Sequential)>]

type MyStruct =

struct

x : byte

y : int

end

請參閱

其他資源

F# 語言參考