Dela via


Attribut (F#)

Med attribut kan metadata tillämpas på en programmeringskonstruktion.

Syntax

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

Kommentarer

I den tidigare syntaxen är målet valfritt och anger om det finns den typ av programentitet som attributet gäller för. Giltiga värden för målet visas i tabellen som visas senare i det här dokumentet.

Attributnamnet refererar till namnet (eventuellt kvalificerat med namnområden) av en giltig attributtyp, med eller utan det suffix Attribute som vanligtvis används i attributtypsnamn. Typen ObsoleteAttribute kan till exempel förkortas till bara Obsolete i den här kontexten.

Argumenten är argumenten till konstruktorn för attributtypen. Om ett attribut har en parameterlös konstruktor kan argumentlistan och parenteserna utelämnas. Attribut stöder både positionsargument och namngivna argument. Positionsargument är argument som används i den ordning de visas. Namngivna argument kan användas om attributet har offentliga egenskaper. Du kan ange dessa med hjälp av följande syntax i argumentlistan.

property-name = property-value

Sådana egenskapsinitieringar kan vara i valfri ordning, men de måste följa eventuella positionsargument. Följande är ett exempel på ett attribut som använder positionsargument och initieringar av egenskaper:

open System.Runtime.InteropServices

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

I det här exemplet är DllImportAttributeattributet , som används här i förkortat format. Det första argumentet är en positionsparameter och det andra är en egenskap.

Attribut är en .NET-programmeringskonstruktion som gör att ett objekt som kallas ett attribut kan associeras med en typ eller ett annat programelement. Det programelement som ett attribut tillämpas på kallas attributmålet. Attributet innehåller vanligtvis metadata om målet. I det här sammanhanget kan metadata vara alla data om typen förutom dess fält och medlemmar.

Attribut i F# kan tillämpas på följande programmeringskonstruktioner: funktioner, metoder, sammansättningar, moduler, typer (klasser, poster, strukturer, gränssnitt, ombud, uppräkningar, fackföreningar och så vidare), konstruktorer, egenskaper, fält, parametrar, typparametrar och returvärden. Attribut tillåts inte för let bindningar i klasser, uttryck eller arbetsflödesuttryck.

Vanligtvis visas attributdeklarationen direkt före deklarationen av attributmålet. Flera attributdeklarationer kan användas tillsammans, enligt följande:

[<Owner("Jason Carlson")>]
[<Company("Microsoft")>]
type SomeType1 =

Du kan köra frågor mot attribut vid körning med hjälp av .NET-reflektion.

Du kan deklarera flera attribut individuellt, som i föregående kodexempel, eller deklarera dem inom en uppsättning hakparenteser om du använder ett semikolon för att separera de enskilda attributen och konstruktorerna på följande sätt:

[<Owner("Darren Parker"); Company("Microsoft")>]
type SomeType2 =

Attribut som vanligtvis påträffas är Obsolete attributet, attribut för säkerhetsöverväganden, attribut för COM-stöd, attribut som relaterar till ägarskap för kod och attribut som anger om en typ kan serialiseras. I följande exempel visas hur attributet Obsolete används.

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

För attributmålen assembly och moduleanvänder du attributen på en bindning på den översta nivån do i sammansättningen. Du kan inkludera ordet assembly eller ``module`` i attributdeklarationen enligt följande:

open System.Reflection
[<assembly:AssemblyVersionAttribute("1.0.0.0")>]
[<``module``:MyCustomModuleAttribute>]
do
   printfn "Executing..."

Om du utelämnar attributmålet för ett attribut som tillämpas på en do bindning försöker F#-kompilatorn fastställa det attributmål som passar för attributet. Många attributklasser har ett attribut av typen System.AttributeUsageAttribute som innehåller information om de möjliga mål som stöds för attributet. System.AttributeUsageAttribute Om indikerar att attributet stöder funktioner som mål, används attributet för att tillämpas på programmets huvudstartpunkt. System.AttributeUsageAttribute Om anger att attributet stöder sammansättningar som mål, tar kompilatorn attributet som ska tillämpas på sammansättningen. De flesta attribut gäller inte för både funktioner och sammansättningar, men i de fall där de gör det används attributet för programmets huvudfunktion. Om attributmålet anges explicit tillämpas attributet på det angivna målet.

Även om du vanligtvis inte behöver ange attributets mål explicit, visas giltiga värden för målet i ett attribut tillsammans med exempel på användning i följande tabell:

Attributmål Exempel
sammansättning
[<assembly: AssemblyVersion("1.0.0.0")>]
modul
[<``module``: MyCustomAttributeThatWorksOnModules>]
retur
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
fält
[<DefaultValue>] val mutable x: int
egenskap
[<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

Se även