属性 (F#)

属性によって、プログラミング コンストラクトに適用されるメタデータが有効になります。

構文

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

解説

前の構文では、target は省略可能であり、存在する場合は、属性によって適用されるプログラム エンティティの種類が指定されます。 target の有効な値は、このドキュメントの後半で示す表に示されています。

attribute-name では、有効な属性型の名前 (名前空間で修飾されている可能性があります) が、通常、属性の型名で使用されるサフィックス Attribute を付けて、または付けずに参照されます。 たとえば、このコンテキストでは、型 ObsoleteAttribute を短くして、Obsolete だけにすることができます。

arguments は、属性の型のコンストラクターへの引数です。 属性にパラメーターなしのコンストラクターがある場合は、引数リストとかっこを省略できます。 属性では、位置引数と名前付き引数の両方がサポートされます。 位置引数 は、出現する順序で使用される引数です。 名前付き引数は、属性にパブリック プロパティがある場合に使用できます。 これらを設定するには、引数リストで次の構文を使用します。

property-name = property-value

このようなプロパティの初期化は任意の順序で行うことができますが、いずれかの位置引数に従う必要があります。 位置引数とプロパティの初期化を使用する属性の例を次に示します。

open System.Runtime.InteropServices

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

この例では、属性は DllImportAttribute です。ここでは、短縮形で使用されています。 最初の引数は位置指定パラメーターで、2 番目はプロパティです。

属性は、attribute と呼ばれるオブジェクトを型または他のプログラム要素に関連付けできるようにする .NET プログラミング コンストラクトです。 属性が適用されるプログラム要素は、属性ターゲット と呼ばれます。 属性には、通常、ターゲットに関するメタデータが含まれます。 このコンテキストでは、メタデータは、そのフィールドやメンバー以外の型に関する任意のデータにすることができます。

F# の属性は、関数、メソッド、アセンブリ、モジュール、型 (クラス、レコード、構造体、インターフェイス、デリゲート、列挙体、共用体など)、コンストラクター、プロパティ、フィールド、パラメーター、型パラメーター、戻り値などのプログラミング構成要素に適用できます。 属性は、クラス、式、またはワークフロー式内の let バインディングでは使用できません。

通常、属性の宣言は、属性ターゲットの宣言の直前に記述されます。 複数の属性宣言を、次のように組み合わせて使用できます。

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

.NET のリフレクションを使用すると、実行時に属性に対してクエリを実行できます。

前のコード例のように、複数の属性を個別に宣言することができます。また、セミコロンを使用して個々の属性とコンストラクターを区切る場合は、1 組の角かっこで宣言することもできます。次に例を示します。

[<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")>]
[<``module``:MyCustomModuleAttribute>]
do
   printfn "Executing..."

do バインディングに適用されている属性の属性ターゲットを省略すると、F# コンパイラによって、その属性にとって意味のある属性ターゲットの特定が試みられます。 多くの属性クラスには、その属性でサポートされている、予想されるターゲットに関する情報を含む型 System.AttributeUsageAttribute の属性があります。 属性でターゲットとして関数がサポートされていることが System.AttributeUsageAttribute によって示される場合、属性は受け取られ、プログラムのメイン エントリ ポイントに適用されます。 属性でターゲットとしてアセンブリがサポートされていることが System.AttributeUsageAttribute によって示される場合、コンパイラによって、属性が受け取られ、アセンブリに適用されます。 ほとんどの属性は、関数とアセンブリの両方には適用されませんが、そのようなことが行われるケースでは、属性は受け取られ、プログラムのメイン関数に適用されます。 属性ターゲットが明示的に指定されている場合は、指定されたターゲットに属性が適用されます。

属性ターゲットは、いつも、明示的に指定する必要があるわけではありませんが、次の表では、属性の ターゲット として有効な値を使用例と共に示します。

属性ターゲット
アセンブリ
[<assembly: AssemblyVersion("1.0.0.0")>]
name
[<``module``: MyCustomAttributeThatWorksOnModules>]
return
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
フィールド
[<DefaultValue>] val mutable x: int
property
[<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

関連項目