次の方法で共有


属性 (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され、ここでは短縮形式で使用されます。 最初の引数は位置指定パラメーターで、2 番目の引数はプロパティです。

属性は、属性と呼ばれるオブジェクトが型またはその他のプログラム 要素に関連付 けられる .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

属性ターゲットの 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

こちらも参照ください