属性 (C# および Visual Basic)
属性は、アセンブリ、型、メソッド、プロパティなどの宣言に関係する情報 (メタデータ) をコードに関連付ける効果的な方法の 1 つです。プログラム要素に関連付けられた属性は、リフレクションと呼ばれる方法によって実行時に照会できます。詳細については、「リフレクション (C# および Visual Basic)」を参照してください。
属性には、次の特徴があります。
属性は、プログラムにメタデータを追加します。メタデータは、プログラム内で定義されている型に関する情報です。すべての .NET アセンブリに、指定した一連のメタデータが含まれ、そこにはそのアセンブリ内で定義されている型および型のメンバーが記述されています。カスタム属性を追加すると、必要な任意の追加情報を指定できます。詳細については、「カスタム属性の作成 (C# および Visual Basic)」を参照してください。
アセンブリ全体、モジュール全体、クラスやプロパティなどの小さいプログラム要素に、1 つ以上の属性を適用できます。
属性は、メソッドやプロパティの場合と同じ方法で引数を受け取ることができます。
プログラムは、リフレクションを使用することにより、そのプログラム専用のメタデータや他のプログラム内のメタデータを調べることができます。詳細については、「リフレクションを使用した属性へのアクセス (C# および Visual Basic)」を参照してください。
属性の使用
属性は、ほとんどすべての宣言に使用できます。ただし、一部の属性は、特定の種類の宣言に対してのみ使用できます。C# では、属性を指定するときは、属性の名前を角かっこ ([]) で囲み、適用するエンティティの宣言の前に置きます。Visual Basic では、属性を山かっこ (< >) で囲みます。属性は、適用する要素の直前に同じ行に記述する必要があります。
次の例では、SerializableAttribute 属性を使用して、クラスに特定の特性を適用しています。
<System.Serializable()> Public Class SampleClass
' Objects of this type can be serialized.
End Class
[System.Serializable]
public class SampleClass
{
// Objects of this type can be serialized.
}
DllImportAttribute 属性をメソッドに適用する場合は、次のように宣言します。
Imports System.Runtime.InteropServices
...
<System.Runtime.InteropServices.DllImport("user32.dll")>
Sub SampleMethod()
End Sub
using System.Runtime.InteropServices;
...
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();
1 つの宣言で複数の属性を指定できます。
Imports System.Runtime.InteropServices
...
Sub MethodA(<[In](), Out()> ByVal x As Double)
End Sub
Sub MethodB(<Out(), [In]()> ByVal x As Double)
End Sub
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) { }
一部の属性は、特定のエンティティに対して 2 回以上指定できます。次の例では、ConditionalAttribute 属性を 2 回使用しています。
<Conditional("DEBUG"), Conditional("TEST1")>
Sub TraceMethod()
End Sub
[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
// ...
}
[!メモ]
規則では、属性名の終わりにはすべて "Attribute" が付きます。これにより、属性と .NET Framework の他の項目を区別できます。ただし、属性を使用するときには、必ずしもこのサフィックスを使用する必要はありません。たとえば、[DllImport] は [DllImportAttribute] と等価ですが、.NET Framework での属性の実際の名前は DllImportAttribute です。
属性パラメーター
多くの属性はパラメーターを持っています。パラメーターには、位置で指定するもの、名前のないもの、名前付きのものがあります。位置で決まるパラメーターは、特定の順序で指定する必要があり、省略できません。名前付きのパラメーターは省略でき、自由な順序で指定できます。位置で決まるパラメーターを最初に指定します。たとえば、次の 3 つの属性は同じものです。
[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
<DllImport("user32.dll")>
<DllImport("user32.dll", SetLastError:=False, ExactSpelling:=False)>
<DllImport("user32.dll", ExactSpelling:=False, SetLastError:=False)>
1 番目のパラメーターである DLL 名は位置で決まるので、常に最初に指定する必要があります。それ以外のパラメーターは名前付きです。この場合、名前付きパラメーターはどちらも既定で false なので、省略できます。既定のパラメーター値については、各属性のドキュメントを参照してください。
属性の対象
属性の対象は、属性が適用されるエンティティです。たとえば、属性はクラス、特定のメソッド、またはアセンブリ全体に適用できます。既定では、属性はその後に続く要素に適用されます。ただし、属性を適用する対象 (メソッド、そのパラメーター、その戻り値など) を明示的に指定することもできます。
属性の対象を明示的に指定するには、次の構文を使用します。
[target : attribute-list]
<target : attribute-list>
有効な target 値の一覧を次の表に示します。
C# |
Visual Basic |
対象 |
---|---|---|
assembly |
Assembly |
アセンブリ全体 |
module |
Module |
現在のアセンブリ モジュール (Visual Basic モジュールとは異なる) |
field |
Not supported |
クラスまたは構造体のフィールド |
event |
Not supported |
Event |
method |
Not supported |
メソッド、または get および set プロパティ アクセサー |
param |
Not supported |
メソッド パラメーターまたは set プロパティ アクセサー |
property |
Not supported |
プロパティ |
return |
Not supported |
メソッド、プロパティ インデクサー、または get プロパティ アクセサーの戻り値 |
type |
Not supported |
構造体、クラス、インターフェイス、列挙型、またはデリゲート |
アセンブリおよびモジュールに属性を適用する方法の例を次に示します。詳細については、「共通の属性 (C# および Visual Basic)」を参照してください。
Imports System.Reflection
<Assembly: AssemblyTitleAttribute("Production assembly 4"),
Module: CLSCompliant(True)>
using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]
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 が戻り値にのみ適用される属性として定義されている場合でも必要です。コンパイラには、AttributeUsage の情報を使用して属性の対象のあいまいさを解決する機能はありません。詳細については、「AttributeUsage (C# および Visual Basic)」を参照してください。
属性の一般的な使用方法
コードでの一般的な属性の使用方法を次に示します。
Web サービスで、メソッドに WebMethod 属性を指定して、メソッドが SOAP プロトコルで呼び出し可能であることを示します。詳細については、「WebMethodAttribute」を参照してください。
ネイティブ コードと相互運用するときに、メソッドのパラメーターをマーシャリングする方法を示します。詳細については、「MarshalAsAttribute」を参照してください。
クラス、メソッド、およびインターフェイスの COM プロパティを示します。
DllImportAttribute クラスを使用してアンマネージ コードを呼び出します。
アセンブリのタイトル、バージョン、説明、または商標を示します。
永続性をシリアル化するクラスのメンバーを示します。
XML シリアル化のクラス メンバーと XML ノードの割り当て方法を示します。
メソッドのセキュリティ要件を示します。
セキュリティを適用するために使用する特性を指定します。
コードをデバッグしやすいように、Just-In-Time (JIT) コンパイラによる最適化を制御します。
メソッドへの呼び出し元に関する情報の取得。
関連項目
詳細については、次のトピックを参照してください。