属性を使用すると、プログラミング構成要素にメタデータを適用できます。Attributes enable metadata to be applied to a programming construct.




前の構文では、ターゲットは省略可能であり、存在する場合は、属性が適用されるプログラムエンティティの種類を指定します。In the previous syntax, the target is optional and, if present, specifies the kind of program entity that the attribute applies to. Targetの有効な値は、このドキュメントの後半で示す表に示されています。Valid values for target are shown in the table that appears later in this document.

属性名は、有効な属性型の名前 (名前空間で修飾されている可能性があります) を参照します。この名前は、通常、属性の型名で使用される Attribute サフィックスはありません。The attribute-name refers to the name (possibly qualified with namespaces) of a valid attribute type, with or without the suffix Attribute that is usually used in attribute type names. たとえば、ObsoleteAttribute 型を短縮して、このコンテキストで Obsolete だけにすることができます。For example, the type ObsoleteAttribute can be shortened to just Obsolete in this context.

引数は、属性の型のコンストラクターへの引数です。The arguments are the arguments to the constructor for the attribute type. 属性にパラメーターなしのコンストラクターがある場合は、引数リストとかっこを省略できます。If an attribute has a parameterless constructor, the argument list and parentheses can be omitted. 属性は、位置指定引数と名前付き引数の両方をサポートします。Attributes support both positional arguments and named arguments. 位置指定引数は、出現する順序で使用される引数です。Positional arguments are arguments that are used in the order in which they appear. 名前付き引数は、属性にパブリックプロパティがある場合に使用できます。Named arguments can be used if the attribute has public properties. これらを設定するには、引数リストで次の構文を使用します。You can set these by using the following syntax in the argument list.

property-name = property-value

このようなプロパティの初期化は任意の順序で行うことができますが、任意の位置指定引数に従う必要があります。Such property initializations can be in any order, but they must follow any positional arguments. 位置指定引数とプロパティの初期化を使用する属性の例を次に示します。The following is an example of an attribute that uses positional arguments and property initializations:

open System.Runtime.InteropServices

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

この例では、属性は DllImportAttributeであり、短縮形で使用されています。In this example, the attribute is DllImportAttribute, here used in shortened form. 最初の引数は位置指定パラメーターで、2番目の引数はプロパティです。The first argument is a positional parameter and the second is a property.

属性は、属性と呼ばれるオブジェクトが型または他のプログラム要素に関連付けられるようにする .net プログラミングコンストラクトです。Attributes are a .NET programming construct that enables an object known as an attribute to be associated with a type or other program element. 属性が適用されるプログラム要素は、属性ターゲットと呼ばれます。The program element to which an attribute is applied is known as the attribute target. 属性には、通常、ターゲットに関するメタデータが含まれます。The attribute usually contains metadata about its target. このコンテキストでは、メタデータは、フィールドやメンバー以外の型に関する任意のデータにすることができます。In this context, metadata could be any data about the type other than its fields and members.

のF#属性は、関数、メソッド、アセンブリ、モジュール、型 (クラス、レコード、構造体、インターフェイス、デリゲート、列挙体、共用体など)、コンストラクター、プロパティ、フィールド、パラメーター、型パラメーター、および戻り値に適用できます。Attributes in F# can be applied to the following programming constructs: functions, methods, assemblies, modules, types (classes, records, structures, interfaces, delegates, enumerations, unions, and so on), constructors, properties, fields, parameters, type parameters, and return values. 属性は、クラス、式、またはワークフロー式内の let バインドでは許可されていません。Attributes are not allowed on let bindings inside classes, expressions, or workflow expressions.

通常、属性の宣言は、属性ターゲットの宣言の直前に記述されます。Typically, the attribute declaration appears directly before the declaration of the attribute target. 複数の属性宣言は、次のように組み合わせて使用できます。Multiple attribute declarations can be used together, as follows:

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

.NET リフレクションを使用すると、実行時に属性に対してクエリを実行できます。You can query attributes at run time by using .NET reflection.

前のコード例のように、複数の属性を個別に宣言することも、セミコロンを使用して個々の属性とコンストラクターを区切る場合は、1組の角かっこで宣言することもできます。次に例を示します。You can declare multiple attributes individually, as in the previous code example, or you can declare them in one set of brackets if you use a semicolon to separate the individual attributes and constructors, as follows:

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

通常、属性には、Obsolete 属性、セキュリティに関する考慮事項の属性、COM サポートの属性、コードの所有権に関連する属性、および型をシリアル化できるかどうかを示す属性があります。Typically encountered attributes include the Obsolete attribute, attributes for security considerations, attributes for COM support, attributes that relate to ownership of code, and attributes indicating whether a type can be serialized. 次の例では、Obsolete 属性の使用方法を示します。The following example demonstrates the use of the Obsolete attribute.

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 バインディングに属性を適用します。For the attribute targets assembly and module, you apply the attributes to a top-level do binding in your assembly. 次のように、属性の宣言に word assembly または module を含めることができます。You can include the word assembly or module in the attribute declaration, as follows:

open System.Reflection
   printfn "Executing..."

do バインディングに適用されている属性の属性ターゲットを省略したF#場合、コンパイラはその属性に対して意味のある属性ターゲットを特定しようとします。If you omit the attribute target for an attribute applied to a do binding, the F# compiler attempts to determine the attribute target that makes sense for that attribute. 多くの属性クラスには、その属性でサポートされているターゲットに関する情報を含む System.AttributeUsageAttribute 型の属性があります。Many attribute classes have an attribute of type System.AttributeUsageAttribute that includes information about the possible targets supported for that attribute. System.AttributeUsageAttribute が、属性がターゲットとしての関数をサポートしていることを示している場合、属性はプログラムのメインエントリポイントに適用されます。If the System.AttributeUsageAttribute indicates that the attribute supports functions as targets, the attribute is taken to apply to the main entry point of the program. 属性がターゲットとしてのアセンブリをサポートしていることが System.AttributeUsageAttribute によって示された場合、コンパイラは、アセンブリに適用する属性を受け取ります。If the System.AttributeUsageAttribute indicates that the attribute supports assemblies as targets, the compiler takes the attribute to apply to the assembly. ほとんどの属性は、関数とアセンブリの両方には適用されませんが、その場合、属性はプログラムの main 関数に適用されます。Most attributes do not apply to both functions and assemblies, but in cases where they do, the attribute is taken to apply to the program's main function. 属性ターゲットが明示的に指定されている場合は、指定されたターゲットに属性が適用されます。If the attribute target is specified explicitly, the attribute is applied to the specified target.

通常、属性ターゲットを明示的に指定する必要はありませんが、次の表に示すように、属性のtargetに有効な値を使用例と共に示します。Although you do not usually need to specify the attribute target explicitly, valid values for target in an attribute along with examples of usage are shown in the following table:

属性のターゲットAttribute target Example
アセンブリ (assembly)assembly
[<assembly: AssemblyVersion("")>]
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 =
    val x : byte
    val y : int

参照See also