共用方式為


屬性(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

針對屬性目標 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>]
方法
[<MyCustomAttributeThatWorksOnMethods>]
let someFunction() = 42
[<MyCustomAttributeThatWorksOnClasses>]
type MyClass(myValue: int) =
    member _.MyValue = myValue
結構體
[<MyCustomAttributeThatWorksOnStructs>]
[<Struct>]
type MyStruct(myValue: int) =
    member _.MyValue = myValue
介面
[<MyCustomAttributeThatWorksOnInterfaces>]
type MyInterface =
    abstract member Prop: string
列舉
[<MyCustomAttributeThatWorksOnEnums>]
type Color =
    | Red = 0
    | Green = 1
    | Blue = 2
構造 函數
type MyClass(myValue: int) =
    member _.MyValue = myValue

    [<MyCustomAttributeThatWorksOnCtors>]
    new () = MyClass 42
返回
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
[<DefaultValue>] val mutable x: int
財產
[<Obsolete>] this.MyProperty = x
參數
member this.MyMethod([<Out>] x : ref<int>) = x := 10
類型
[<type: StructLayout(LayoutKind.Sequential)>]
type MyStruct =
  struct
    val x : byte
    val y : int
  end

另請參閱