型のメンバ

ランタイムでは、型のメンバとして、イベント、フィールド、入れ子にされた型、メソッド、プロパティなどを定義できます。それぞれのメンバにはシグネチャがあります。.NET Framework で使用される型のメンバについて次の表で説明します。

メンバ 説明

イベント

応答する対象となる事象 (イベント) を定義し、そのイベントへのサブスクライブ、イベントからのサブスクライブ解除、およびイベントの発生用のメソッドを定義します。多くの場合、イベントは、他の型に対して状態の変更を通知するために使用されます。

フィールド

型の状態の一部を記述し、格納します。フィールドは、ランタイムがサポートする任意の型にすることができます。

入れ子にされた型

外側の型のスコープ内で型を定義します。

メソッド

型に対して実行できる操作を記述します。メソッドのシグネチャは、そのメソッドの引数の型および戻り値の型として許可される型を示します。

コンストラクタは特別な種類のメソッドで、型の新しいインスタンスを作成します。

プロパティ

型の値または状態に名前を付け、そのプロパティの値を取得または設定するためのメソッドを定義します。プロパティは、プリミティブ型、プリミティブ型のコレクション、ユーザー定義型、ユーザー定義型のコレクションにすることができます。多くの場合、プロパティは、型のパブリックなインターフェイスを、その型の個々の実装とは切り離すために使用されます。

メンバの特性

共通型システムでは、型のメンバにさまざまな特性を適用できますが、各言語で、これらの特性をすべてサポートする必要はありません。メンバの特性について次の表で説明します。

特性 適用対象 説明

abstract

メソッド、プロパティ、およびイベント

型はメソッドの実装を提供しません。抽象メソッドを継承する型と、抽象メソッドを含むインターフェイスを実装する型が、メソッドの実装を提供する必要があります。唯一の例外は、派生型自体が抽象型である場合です。すべての抽象メソッドは仮想メソッドです。

private、family、assembly、family and assembly、family or assembly、または public

すべて

メンバのアクセシビリティを次のように定義します。

private

メンバが含まれているのと同じ型の内部、またはその型に入れ子にされた型の内部からだけアクセスできます。

family

メンバが含まれているのと同じ型の内部、およびその型を継承した派生型からアクセスできます。

assembly

型が定義されているアセンブリ内でだけアクセスできます。

family and assembly

family アクセスと assembly アクセスの両特性を満たす型からだけアクセスできます。

family or assembly

family アクセスまたは assembly アクセスのいずれかの特性を満たす型からだけアクセスできます。

public

すべての型からアクセスできます。

final

メソッド、プロパティ、およびイベント

その仮想メソッドを派生型ではオーバーライドできません。

initialize-only

フィールド

値を初期化することだけでき、初期化後の書き込みは実行できません。

instance

フィールド、メソッド、プロパティ、およびイベント

メンバが static (C# および C++)、Shared (Visual Basic)、virtual (C# および C++)、または Overridable (Visual Basic) でマークされていない場合、そのメンバはインスタンス メンバになります (instance キーワードはありません)。このようなメンバについては、型を使用するオブジェクトと同数のコピーがメモリ内に格納されます。

literal

フィールド

このフィールドには、組み込みの値型の、コンパイル時点の固定値が割り当てられます。リテラル フィールドを定数と呼ぶこともあります。

newslot または override

すべて

メンバが、同じシグネチャを持つ継承メンバをどのように処理するかを定義します。

newslot

同じシグネチャを持つ継承されたメンバを隠ぺいします。

override

継承された仮想メソッドの定義を置き換えます。

既定値は newslot です。

static

フィールド、メソッド、プロパティ、およびイベント

メンバは、型の特定のインスタンスではなく、そのメンバが定義されている型に属します。つまり、メンバは型がインスタンス化されていなくても存在し、その型のすべてのインスタンスによって共有されます。

virtual

メソッド、プロパティ、およびイベント

メソッドは、派生型で実装でき、静的または動的に呼び出すことができます。動的呼び出しが行われる場合は、コンパイル時点の型ではなく、実行時に呼び出しを行うインスタンスの型によって、メソッドのどの実装が呼び出されるかが決定されます。仮想メソッドを静的に呼び出すには、目的のバージョンのメソッドを使用する型に、変数をキャストする必要が生じる場合があります。

オーバーロード

型のメンバには、それぞれ固有のシグネチャがあります。メソッドのシグネチャは、メソッドの名前とパラメータ リスト (メソッドの引数の順序と型) で構成されます。シグネチャが異なっていれば、同じ名前を持つ複数のメソッドを 1 つの型の中で定義できます。同じ名前を持つ 2 つ以上のメソッドが定義されている場合、そのメソッドはオーバーロードされている、と言います。パラメータ リストには、varargs 制約を適用できます。varargs は、メソッドが可変個の引数のリストをサポートすることを示します。たとえば、System.Char では、IsDigit がオーバーロードされています。1 つのメソッドは引数として Char を受け取り、Boolean を返します。別のメソッドは StringInt32 を引数として受け取り、Boolean を返します。

メンバの継承、オーバーライド、および隠ぺい

派生型は、基本型のすべてのメンバを継承します。つまり、基本型のすべてのメンバは、派生型に対しても定義され、派生型から使用できます。継承されたメンバの動作または特性は、次の 2 つの方法で変更できます。

  • 派生型で、同じシグネチャを持つ新しいメンバを定義することによって、継承されたメンバを隠ぺいできます。この方法は、public のメンバを private に変更したり、final としてマークされている継承メソッドに新しい動作を定義したりするために使用します。

  • 派生型で、継承された仮想メソッドをオーバーライドできます。オーバーライドするメソッドでは、コンパイル時点の変数の型ではなく、実行時の値の型に基づいて呼び出される、メソッドの新しい定義を提供します。メソッドが仮想メソッドをオーバーライドできるのは、その仮想メソッドが final としてマークされておらず、新しいメソッドのアクセシビリティがその仮想メソッドと少なくとも同じ場合に限られます。

参照

概念

型定義

その他の技術情報

共通型システム
メンバのデザインのガイドライン
型のデザインのガイドライン