属性 (C#)Attributes (C#)

属性は、メタデータまたは宣言型の情報を、コード (アセンブリ、型、メソッド、プロパティなど) に関連付けるための優れた方法です。Attributes provide a powerful method of associating metadata, or declarative information, with code (assemblies, types, methods, properties, and so forth). 属性をプログラム要素に関連付けると、リフレクションと呼ばれる手法を使用して、実行時にその属性を照会することができます。After an attribute is associated with a program entity, the attribute can be queried at run time by using a technique called reflection. 詳細については、「リフレクション (C#)」を参照してください。For more information, see Reflection (C#).

属性には、次の特徴があります。Attributes have the following properties:

  • 属性は、プログラムにメタデータを追加します。Attributes add metadata to your program. メタデータは、プログラムで定義された型に関する情報です。Metadata is information about the types defined in a program. すべての .NET アセンブリには、アセンブリで定義された型および型のメンバーを記述する、指定されたメタデータのセットが含まれます。All .NET assemblies contain a specified set of metadata that describes the types and type members defined in the assembly. カスタム属性を追加して、必要な追加情報を指定することができます。You can add custom attributes to specify any additional information that is required. 詳細については、「カスタム属性の作成 (C#)」を参照してください。For more information, see, Creating Custom Attributes (C#).

  • 属性は、アセンブリ全体、モジュール、またはクラスやプロパティなどのより小さいプログラム要素に 1 つ以上適用することができます。You can apply one or more attributes to entire assemblies, modules, or smaller program elements such as classes and properties.

  • 属性は、メソッドやプロパティと同じ方法で引数を受け取ることができます。Attributes can accept arguments in the same way as methods and properties.

  • リフレクションを使用して、プログラム自身のメタデータや他のプログラムのメタデータを調べることができます。Your program can examine its own metadata or the metadata in other programs by using reflection. 詳しくは、「リフレクションを使用した属性へのアクセス (C#)」をご覧ください。For more information, see Accessing Attributes by Using Reflection (C#).

属性の使用Using Attributes

属性は、ほぼすべての宣言に配置できますが、属性によっては、有効な宣言の型が制限されている場合もあります。Attributes can be placed on most any declaration, though a specific attribute might restrict the types of declarations on which it is valid. C# では、角かっこ ([]) で囲んだ属性の名前を、適用先のエンティティの宣言の前に配置して、属性を指定します。In C#, you specify an attribute by placing the name of the attribute, enclosed in square brackets ([]), above the declaration of the entity to which it applies.

この例では、SerializableAttribute 属性を使用してクラスに特性を適用します。In this example, the SerializableAttribute attribute is used to apply a specific characteristic to a class:

[System.Serializable]  
public class SampleClass  
{  
    // Objects of this type can be serialized.  
}  

属性 DllImportAttribute を持つメソッドは次のように宣言されます。A method with the attribute DllImportAttribute is declared like this:

using System.Runtime.InteropServices;  
[System.Runtime.InteropServices.DllImport("user32.dll")]  
extern static void SampleMethod();  

宣言には、複数の属性を配置できます。More than one attribute can be placed on a declaration:

using System.Runtime.InteropServices;  
void MethodA([In][Out] ref double x) { }  
void MethodB([Out][In] ref double x) { }  
void MethodC([In, Out] ref double x) { }  

特定のエンティティで複数回指定できる属性もあります。Some attributes can be specified more than once for a given entity. このような複数回指定できる属性の例として ConditionalAttribute があります。An example of such a multiuse attribute is ConditionalAttribute:

[Conditional("DEBUG"), Conditional("TEST1")]  
void TraceMethod()  
{  
    // ...  
}  

注意

慣例により、属性名はすべて "Attribute" という単語で終わります。これは、.NET Framework の他の項目と区別するためです。By convention, all attribute names end with the word "Attribute" to distinguish them from other items in the .NET Framework. ただし、コード内で属性を使用する場合は、attribute サフィックスを指定する必要はありません。However, you do not need to specify the attribute suffix when using attributes in code. たとえば、[DllImport][DllImportAttribute] と同等ですが、.NET Framework では DllImportAttribute は属性の実際の名前を表します。For example, [DllImport] is equivalent to [DllImportAttribute], but DllImportAttribute is the attribute's actual name in the .NET Framework.

属性のパラメーターAttribute Parameters

属性の多くは、位置指定パラメーター、名前のないパラメーター、または名前付きパラメーターを持っています。Many attributes have parameters, which can be positional, unnamed, or named. 位置指定パラメーターは、特定の順序で指定する必要があり、省略できません。名前付きパラメーターは省略可能で、任意の順序で指定することができます。Any positional parameters must be specified in a certain order and cannot be omitted; named parameters are optional and can be specified in any order. 位置指定パラメーターは、最初に指定します。Positional parameters are specified first. たとえば、次の 3 つの属性は同等です。For example, these three attributes are equivalent:

[DllImport("user32.dll")]  
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]  
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]  

最初のパラメーターである DLL 名は位置指定パラメーターであり、常に最初に指定されます。他のパラメーターは名前付きパラメーターです。The first parameter, the DLL name, is positional and always comes first; the others are named. この例の場合、名前付きパラメーターの既定値はどちらも false なので、省略することができます。In this case, both named parameters default to false, so they can be omitted. パラメーターの既定値については、個々の属性のドキュメントを参照してください。Refer to the individual attribute's documentation for information on default parameter values.

属性の対象Attribute Targets

属性の対象は、属性が適用されるエンティティです。The target of an attribute is the entity to which the attribute applies. たとえば、属性は、クラス、特定のメソッド、またはアセンブリ全体に適用できます。For example, an attribute may apply to a class, a particular method, or an entire assembly. 既定では、属性は後に続く要素に適用されます。By default, an attribute applies to the element that it precedes. ただし、明示的に指定すれば、メソッド、属性のパラメーター、属性の戻り値などにも適用できます。But you can also explicitly identify, for example, whether an attribute is applied to a method, or to its parameter, or to its return value.

属性の対象を明示的に識別するには、次の構文を使用します。To explicitly identify an attribute target, use the following syntax:

[target : attribute-list]  

次の表に、使用可能な target の値を示します。The list of possible target values is shown in the following table.

対象の値Target value 対象Applies to
assembly アセンブリ全体Entire assembly
module 現在のアセンブリ モジュールCurrent assembly module
field クラスまたは構造体のフィールドField in a class or a struct
event eventEvent
method メソッドまたは get および set プロパティ アクセサーMethod or get and set property accessors
param メソッド パラメーターまたは set プロパティ アクセサー パラメーターMethod parameters or set property accessor parameters
property プロパティProperty
return メソッド、プロパティ インデクサー、または get プロパティ アクセサーの戻り値Return value of a method, property indexer, or get property accessor
type 構造体、クラス、インターフェイス、列挙型、またはデリゲートStruct, class, interface, enum, or delegate

次の例では、アセンブリとモジュールに属性を適用する方法を示します。The following example shows how to apply attributes to assemblies and modules. 詳細については、「共通の属性 (C#)」を参照してください。For more information, see Common Attributes (C#).

using System;  
using System.Reflection;  
[assembly: AssemblyTitleAttribute("Production assembly 4")]  
[module: CLSCompliant(true)]  

C# でメソッド、メソッドのパラメーター、およびメソッドの戻り値に属性を適用する方法の例を次に示します。The following example shows how to apply attributes to methods, method parameters, and method return values in C#.

// default: applies to method  
[SomeAttr]  
int Method1() { return 0; }  

// applies to method  
[method: SomeAttr]  
int Method2() { return 0; }  

// applies to return value  
[return: SomeAttr]  
int Method3() { return 0; }  

注意

SomeAttr が有効になるように定義されるターゲットが何であっても、return は指定する必要があります。これは、SomeAttr が戻り値にのみ適用されるように定義されている場合でも必要です。Regardless of the targets on which SomeAttr is defined to be valid, the return target has to be specified, even if SomeAttr were defined to apply only to return values. つまり、コンパイラは AttributeUsage 情報を使用して、あいまいな属性ターゲットを解決しません。In other words, the compiler will not use AttributeUsage information to resolve ambiguous attribute targets. 詳細については、「AttributeUsage (C#)」を参照してください。For more information, see AttributeUsage (C#).

属性の一般的な使用法Common Uses for Attributes

次の表に、コードでの属性の一般的な使用法をいくつか示します。The following list includes a few of the common uses of attributes in code:

  • Web サービスの WebMethod 属性を使用してメソッドをマークして、メソッドが SOAP プロトコルを介して呼び出されるようにします。Marking methods using the WebMethod attribute in Web services to indicate that the method should be callable over the SOAP protocol. 詳細については、「WebMethodAttribute」を参照してください。For more information, see WebMethodAttribute.

  • ネイティブ コードと相互運用するときにメソッドのパラメーターをマーシャリングする方法を記述します。Describing how to marshal method parameters when interoperating with native code. 詳細については、「MarshalAsAttribute」を参照してください。For more information, see MarshalAsAttribute.

  • クラス、メソッド、およびインターフェイスの COM プロパティを記述します。Describing the COM properties for classes, methods, and interfaces.

  • DllImportAttribute クラスを使用してアンマネージ コードを呼び出します。Calling unmanaged code using the DllImportAttribute class.

  • タイトル、バージョン、説明、または商標についてのアセンブリを記述します。Describing your assembly in terms of title, version, description, or trademark.

  • 永続化のためにシリアル化するクラスのメンバーを記述します。Describing which members of a class to serialize for persistence.

  • XML シリアル化のためにクラス メンバーと XML ノード間をマップする方法を記述します。Describing how to map between class members and XML nodes for XML serialization.

  • メソッドのセキュリティ要件を記述します。Describing the security requirements for methods.

  • セキュリティを適用するための特性を指定します。Specifying characteristics used to enforce security.

  • コードを容易にデバッグできる状態に保つために、ジャスト イン タイム (JIT) コンパイラによって最適化を制御します。Controlling optimizations by the just-in-time (JIT) compiler so the code remains easy to debug.

  • メソッドの呼び出し元に関する情報を取得します。Obtaining information about the caller to a method.

詳細については次を参照してください:For more information, see:

参照See Also

C# プログラミング ガイドC# Programming Guide
リフレクション (C#)Reflection (C#)
属性Attributes