Share via


共通の属性 (C# および Visual Basic)

このトピックでは、C# および Visual Basic プログラムで最もよく使用される属性について説明します。

  • グローバル属性

  • Obsolete 属性

  • Conditional 属性

  • Visual Basic の属性

グローバル属性

ほとんどの属性は、クラスやメソッドなど、特定の言語要素に結び付けられています。ただし、属性の中にはグローバルなものがあり、アセンブリまたはモジュール全体に適用されます。 たとえば、AssemblyVersionAttribute 属性は、次のように、バージョン情報をアセンブリに埋め込むときに使用できます。

[assembly: AssemblyVersion("1.0.0.0")]
<Assembly: AssemblyVersion("1.0.0.0")>

グローバル属性は、ソース コードにおいて、トップレベルの using ディレクティブ (Visual Basic では Imports) の後、そして型、モジュール、または名前空間の宣言より前に指定します。 グローバル属性は複数のソース ファイルに指定できますが、指定したファイルは、1 つのコンパイル パスでコンパイルする必要があります。 Visual Basic プロジェクトの場合、グローバル属性は通常、Visual Basic プロジェクトと共に自動的に作成される AssemblyInfo.vb ファイルに記述されます。 C# プロジェクトの場合は、AssemblyInfo.cs ファイルに記述されます。

アセンブリ属性は、アセンブリについての情報を提供する値です。 アセンブリ属性は、以下のカテゴリに分けられます。

  • アセンブリ ID 属性

  • 情報属性

  • アセンブリ マニフェスト属性

  • 厳密な名前の属性

アセンブリ ID 属性

名前、バージョン、およびカルチャの 3 つの属性 (適用可能な場合は厳密な名前で) で、アセンブリの ID が決定されます。 これらの属性は、アセンブリの完全な名前を形成し、コード内でアセンブリを参照するときに必要になります。 アセンブリのバージョンとカルチャは、属性を使用して設定できます。 ただし、名前の値は、コンパイラ、Visual Studio IDE ([アセンブリ情報] ダイアログ ボックス内で)、またはアセンブリ リンカー (Al.exe) によって、アセンブリが作成されるときにアセンブリ マニフェストを含むファイルに基づいて設定されます。 AssemblyFlagsAttribute 属性は、アセンブリの複数のコピーが共存できるかどうかを指定します。

次の表は、ID 属性を示しています。

属性

目的

AssemblyName

アセンブリの ID を完全に記述します。

AssemblyVersionAttribute

アセンブリのバージョンを指定します。

AssemblyCultureAttribute

アセンブリがサポートするカルチャを指定します。

AssemblyFlagsAttribute

同一のコンピューター上、同じプロセス内、または同じアプリケーション ドメイン内で、アセンブリが side-by-side 実行をサポートするかどうかを指定します。

情報属性

情報属性は、アセンブリに追加の会社情報または製品情報を指定する場合に使用できます。 次の表は、System.Reflection 名前空間で定義されている情報属性を示しています。

属性

目的

AssemblyProductAttribute

アセンブリ マニフェストの製品名を指定するカスタム属性を定義します。

AssemblyTrademarkAttribute

アセンブリ マニフェストの商標を指定するカスタム属性を定義します。

AssemblyInformationalVersionAttribute

アセンブリ マニフェストの補足バージョンを指定するカスタム属性を定義します。

AssemblyCompanyAttribute

アセンブリ マニフェストの会社名を指定するカスタム属性を定義します。

AssemblyCopyrightAttribute

アセンブリ マニフェストの著作権を指定するカスタム属性を定義します。

AssemblyFileVersionAttribute

Win32 ファイル バージョン リソースに特定のバージョン番号を使用するように、コンパイラに指示します。

CLSCompliantAttribute

アセンブリが共通言語仕様 (CLS: Common Language Specification) に準拠しているかどうかを示します。

アセンブリ マニフェスト属性

アセンブリ マニフェスト属性を使用すると、アセンブリ マニフェストの情報を指定できます。 たとえば、タイトル、説明、既定のエイリアス、構成などです。 次の表は、System.Reflection 名前空間で定義されているアセンブリ マニフェスト属性を示しています。

属性

目的

AssemblyTitleAttribute

アセンブリ マニフェストのアセンブリ タイトルを指定するカスタム属性を定義します。

AssemblyDescriptionAttribute

アセンブリ マニフェストのアセンブリ説明を指定するカスタム属性を定義します。

AssemblyConfigurationAttribute

アセンブリ マニフェストのアセンブリ構成 (リリース、デバッグなど) を指定するカスタム属性を定義します。

AssemblyDefaultAliasAttribute

アセンブリ マニフェストのわかりやすい既定のエイリアスを定義します。

厳密な名前の属性

以前のバージョンの Visual Studio では、厳密な名前でアセンブリに署名する処理は、以下のアセンブリ レベルの属性によって実行されていました。

この方法も引き続きサポートされますが、アセンブリに署名するには、プロジェクト デザイナーの [署名] ページを使用することをお勧めします。 詳細については、「[署名] ページ (プロジェクト デザイナー)」および「方法 : アセンブリに署名する (Visual Studio)」を参照してください。

Obsolete 属性

Obsolete 属性によって、プログラム要素が、使用を推奨されない要素としてマークされます。 要素に Obsolete とマークするたびに、属性の設定内容に応じて、警告やエラーが生成されます。 次に例を示します。

    <System.Obsolete("use class B")> 
    Class A
        Sub Method()
        End Sub
    End Class

    Class B
        <System.Obsolete("use NewMethod", True)> 
        Sub OldMethod()
        End Sub

        Sub NewMethod()
        End Sub
    End Class

[System.Obsolete("use class B")]
class A
{
    public void Method() { }
}
class B
{
    [System.Obsolete("use NewMethod", true)]
    public void OldMethod() { }
    public void NewMethod() { }
}

この例で、Obsolete 属性は A クラスと B.OldMethod メソッドに適用されています。 B.OldMethod に適用されている属性のコンストラクターで、2 つ目の引数が true に設定されているため、このメソッドを使用するとコンパイラ エラーになり、A クラスを使用すると単に警告が生成されます。 一方で、B.NewMethod を呼び出しても警告やエラーは生成されません。

属性のコンストラクターで、1 つ目の引数として指定された文字列は、警告またはエラーの一部に表示されます。 たとえば、次のコードを前の定義と共に使用すると、2 つの警告と 1 つのエラーが生成されます。

' Generates 2 warnings:
' Dim a As New A
' Generate no errors or warnings:

Dim b As New B
b.NewMethod()

' Generates an error, terminating compilation:
' b.OldMethod()
// Generates 2 warnings:
// A a = new A();

// Generate no errors or warnings:
B b = new B();
b.NewMethod();

// Generates an error, terminating compilation:
// b.OldMethod();

A クラスでは 2 つの警告が生成されます。1 つはクラス参照の宣言、もう 1 つはクラスのコンストラクターで生成されます。

Obsolete 属性は引数なしでも使用できますが、その項目の使用が推奨されない理由と代わりに使用する項目を引数に指定することをお勧めします。

Obsolete 属性は、シングルユースの属性です。属性を使用できる任意の要素に適用できます。 Obsolete は ObsoleteAttribute のエイリアスです。

Conditional 属性

Conditional 属性は、プリプロセスの識別子に応じてメソッドが実行されるようにします。 Conditional 属性は、ConditionalAttribute のエイリアスであり、メソッドまたは属性クラスに適用できます。

この例で、Conditional は、プログラム固有の診断情報について表示/非表示を切り替えるメソッドに適用されます。


#Const TRACE_ON = True
Imports System
Imports System.Diagnostics
Module TestConditionalAttribute
    Public Class Trace
        <Conditional("TRACE_ON")> 
        Public Shared Sub Msg(ByVal msg As String)
            Console.WriteLine(msg)
        End Sub

    End Class

    Sub Main()
        Trace.Msg("Now in Main...")
        Console.WriteLine("Done.")
    End Sub
End Module
#define TRACE_ON
using System;
using System.Diagnostics;

public class Trace
{
    [Conditional("TRACE_ON")]
    public static void Msg(string msg)
    {
        Console.WriteLine(msg);
    }
}

public class ProgramClass
{
    static void Main()
    {
        Trace.Msg("Now in Main...");
        Console.WriteLine("Done.");
    }
}

TRACE_ON 識別子が定義されていないと、トレース出力は表示されません。

Conditional 属性は、リリース ビルドではなく、デバッグ ビルドでトレース機能とログ機能を有効にするために、DEBUG 識別子と共によく使用されます。例を次に示します。

<Conditional("DEBUG")> 
Shared Sub DebugMethod()

End Sub
[Conditional("DEBUG")]
static void DebugMethod()
{
}

Conditional とマークされたメソッドが呼び出される場合、指定したプリプロセスのシンボルが存在するかどうかで、呼び出しが含まれるかどうかが決まります。 シンボルが定義されている場合は呼び出しが行われ、定義されていない場合は呼び出しは行われません。 次のようにメソッドを #if…#endif ブロックで囲む代わりに Conditional を使用すると、コードがわかりやすく洗練され、ミスが発生する可能性が低くなります。

#If DEBUG Then
    Sub ConditionalMethod()
    End Sub
#End If
#if DEBUG
    void ConditionalMethod()
    {
    }
#endif

条件付きメソッドは、クラスまたは構造体の宣言内に含まれるメソッドである必要があり、戻り値を持つことはできません。

複数の識別子の使用

メソッドに複数の Conditional 属性が指定されている場合は、条件シンボルの 1 つでも定義されているとメソッドの呼び出しが行われます。つまり、複数のシンボルは OR 演算子を使用して論理的に結合されます。 この例では、A または B が存在する場合にメソッドが呼び出されます。

<Conditional("A"), Conditional("B")> 
Shared Sub DoIfAorB()

End Sub
[Conditional("A"), Conditional("B")]
static void DoIfAorB()
{
    // ...
}

AND 演算子を使用して論理的にシンボルを結合した場合と同等の結果を得るには、条件付きメソッドを連続的に定義する方法があります。 たとえば、次の 2 つ目のメソッドは、A と B の両方が定義されている場合にのみ実行されます。

<Conditional("A")> 
Shared Sub DoIfA()
    DoIfAandB()
End Sub

<Conditional("B")> 
Shared Sub DoIfAandB()
    ' Code to execute when both A and B are defined...
End Sub
[Conditional("A")]
static void DoIfA()
{
    DoIfAandB();
}

[Conditional("B")]
static void DoIfAandB()
{
    // Code to execute when both A and B are defined...
}

属性クラスでの Conditional の使用

Conditional 属性は、属性クラスの定義にも適用できます。 この例のカスタム属性 Documentation では、DEBUG が定義されている場合にのみ、メタデータに情報が追加されます。

<Conditional("DEBUG")> 
Public Class Documentation
    Inherits System.Attribute
    Private text As String
    Sub New(ByVal doc_text As String)
        text = doc_text
    End Sub
End Class

Class SampleClass
    ' This attribute will only be included if DEBUG is defined.
    <Documentation("This method displays an integer.")> 
    Shared Sub DoWork(ByVal i As Integer)
        System.Console.WriteLine(i)
    End Sub
End Class
[Conditional("DEBUG")]
public class Documentation : System.Attribute
{
    string text;

    public Documentation(string text)
    {
        this.text = text;
    }
}

class SampleClass
{
    // This attribute will only be included if DEBUG is defined.
    [Documentation("This method displays an integer.")]
    static void DoWork(int i)
    {
        System.Console.WriteLine(i.ToString());
    }
}

Visual Basic の属性

Visual Basic 固有の属性の一覧を次の表に示します。

属性

目的

ComClassAttribute

クラスを COM オブジェクトとして公開する必要があることをコンパイラに指示します。

HideModuleNameAttribute

モジュールに必要な修飾子のみを指定してモジュール メンバーにアクセスできます。

VBFixedStringAttribute

ファイルの入出力関数で使用する、構造体内の固定長文字列のサイズを指定します。

VBFixedArrayAttribute

ファイルの入出力関数で使用する、構造体内の固定配列のサイズを指定します。

COMClassAttribute

COMClassAttribute を使用すると、Visual Basic から COM コンポーネントを作成するプロセスを簡略化できます。 COM オブジェクトは .NET Framework アセンブリとは大きく異なるため、COMClassAttribute を使用せずに Visual Basic から COM オブジェクトを生成するには、多くの手順を実行する必要があります。 COMClassAttribute が適用されたクラスでは、これらの手順の多くがコンパイラによって自動的に実行されます。

HideModuleNameAttribute

モジュールに必要な修飾子のみを使用してモジュール メンバーにアクセスできるようにするには、HideModuleNameAttribute を使用します。

VBFixedStringAttribute

Visual Basic で強制的に固定長文字列を作成するには、VBFixedStringAttribute を使用します。 文字列は既定では可変長です。この属性は、文字列をファイルに格納する場合に役立ちます。 次のコードで例を示します。

Structure Worker
    ' The runtime uses VBFixedString to determine 
    ' if the field should be written out as a fixed size.
    <VBFixedString(10)> Public LastName As String
    <VBFixedString(7)> Public Title As String
    <VBFixedString(2)> Public Rank As String
End Structure

VBFixedArrayAttribute

固定サイズの配列を宣言するには、VBFixedArrayAttribute を使用します。 Visual Basic の文字列と同様に、既定では配列は可変長です。 この属性は、データをファイルにシリアル化する場合や書き込む場合に役立ちます。

参照

参照

リフレクション (C# および Visual Basic)

リフレクションを使用した属性へのアクセス (C# および Visual Basic)

System.Reflection

Attribute

概念

C# プログラミング ガイド

属性を使用したメタデータの拡張

その他の技術情報

Visual Basic のプログラミング ガイド