Delen via


Kenmerken (F#)

Met kenmerken kunnen metagegevens worden toegepast op een programmeerconstructie.

Syntaxis

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

Opmerkingen

In de vorige syntaxis is het doel optioneel en, indien aanwezig, geeft u het type programma-entiteit op waarop het kenmerk van toepassing is. Geldige waarden voor het doel worden weergegeven in de tabel die verderop in dit document wordt weergegeven.

De kenmerknaam verwijst naar de naam (mogelijk gekwalificeerd met naamruimten) van een geldig kenmerktype, met of zonder het achtervoegsel Attribute dat meestal wordt gebruikt in kenmerktypenamen. Het type ObsoleteAttribute kan bijvoorbeeld worden ingekort tot alleen Obsolete in deze context.

De argumenten zijn de argumenten voor de constructor voor het kenmerktype. Als een kenmerk een parameterloze constructor heeft, kunnen de argumentenlijst en haakjes worden weggelaten. Kenmerken ondersteunen zowel positionele argumenten als benoemde argumenten. Positionele argumenten zijn argumenten die worden gebruikt in de volgorde waarin ze worden weergegeven. Benoemde argumenten kunnen worden gebruikt als het kenmerk openbare eigenschappen heeft. U kunt deze instellen met behulp van de volgende syntaxis in de lijst met argumenten.

property-name = property-value

Dergelijke eigenschaps initialisaties kunnen in elke volgorde staan, maar ze moeten eventuele positionele argumenten volgen. Hier volgt een voorbeeld van een kenmerk dat positionele argumenten en initialisaties van eigenschappen gebruikt:

open System.Runtime.InteropServices

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

In dit voorbeeld wordt het kenmerk gebruikt DllImportAttributein verkorte vorm. Het eerste argument is een positionele parameter en het tweede is een eigenschap.

Kenmerken zijn een .NET-programmeerconstructie waarmee een object dat een kenmerk wordt genoemd, kan worden gekoppeld aan een type of een ander programma-element. Het programma-element waarop een kenmerk wordt toegepast, wordt het kenmerkdoel genoemd. Het kenmerk bevat meestal metagegevens over het doel. In deze context kunnen metagegevens gegevens zijn over het andere type dan de velden en leden.

Kenmerken in F# kunnen worden toegepast op de volgende programmeerconstructies: functies, methoden, assembly's, modules, typen (klassen, records, structuren, interfaces, gemachtigden, opsommingen, samenvoegingen, enzovoort), constructors, eigenschappen, velden, parameters, typeparameters en retourwaarden. Kenmerken zijn niet toegestaan voor let bindingen in klassen, expressies of werkstroomexpressies.

Normaal gesproken wordt de kenmerkdeclaratie direct vóór de declaratie van het kenmerkdoel weergegeven. Meerdere kenmerkdeclaraties kunnen als volgt samen worden gebruikt:

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

U kunt tijdens runtime query's uitvoeren op kenmerken met behulp van .NET-reflectie.

U kunt meerdere kenmerken afzonderlijk declareren, zoals in het vorige codevoorbeeld, of u kunt ze als volgt declareren in één set vierkante haken als u een puntkomma gebruikt om de afzonderlijke kenmerken en constructors te scheiden:

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

Meestal zijn kenmerken het Obsolete kenmerk, kenmerken voor beveiligingsoverwegingen, kenmerken voor COM-ondersteuning, kenmerken die betrekking hebben op het eigendom van code en kenmerken die aangeven of een type kan worden geserialiseerd. In het volgende voorbeeld ziet u het gebruik van het Obsolete kenmerk.

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

Voor de kenmerkdoelen assembly en modulepast u de kenmerken toe op een binding op het hoogste niveau do in uw assembly. U kunt het woord assembly of ``module`` in de kenmerkdeclaratie als volgt opnemen:

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

Als u het kenmerkdoel weglaat voor een kenmerk dat is toegepast op een do binding, probeert de F#-compiler het kenmerkdoel te bepalen dat zinvol is voor dat kenmerk. Veel kenmerkklassen hebben een kenmerk van het type System.AttributeUsageAttribute dat informatie bevat over de mogelijke doelen die voor dat kenmerk worden ondersteund. Als de System.AttributeUsageAttribute waarde aangeeft dat het kenmerk functies ondersteunt als doelen, wordt het kenmerk gebruikt om toe te passen op het hoofdinvoerpunt van het programma. Als het System.AttributeUsageAttribute kenmerk aangeeft dat het kenmerk assembly's ondersteunt als doelen, neemt de compiler het kenmerk om toe te passen op de assembly. De meeste kenmerken zijn niet van toepassing op zowel functies als assembly's, maar in gevallen waarin ze dat doen, wordt het kenmerk gebruikt om toe te passen op de hoofdfunctie van het programma. Als het kenmerkdoel expliciet is opgegeven, wordt het kenmerk toegepast op het opgegeven doel.

Hoewel u meestal niet expliciet het kenmerkdoel hoeft op te geven, worden geldige waarden voor het doel in een kenmerk samen met voorbeelden van gebruik weergegeven in de volgende tabel:

Kenmerkdoel Opmerking
assembly
[<assembly: AssemblyVersion("1.0.0.0")>]
module
[<``module``: MyCustomAttributeThatWorksOnModules>]
enter
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
veld
[<DefaultValue>] val mutable x: int
eigenschap
[<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

Zie ook