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 DllImportAttribute
in 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 module
past 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 |
|
module |
|
enter |
|
veld |
|
eigenschap |
|
param |
|
type |
|