新しいオブジェクトまたは値型の新しいインスタンスを作成し、オブジェクト参照 (O 型) を評価スタックにプッシュします。
Public Shared ReadOnly Newobj As OpCode
[C#]
public static readonly OpCode Newobj;
[C++]
public: static OpCode Newobj;
[JScript]
public static var Newobj : OpCode;
解説
命令の 16 進数の形式、MSIL (Microsoft Intermediate Language) アセンブリ形式、および簡単な説明の一覧を次の表に示します。
形式 | アセンブリ形式 | 説明 |
---|---|---|
73 < T > | newobj ctor | 初期化されていないオブジェクトまたは値型を割り当て、コンストラクタ メソッド ctor を呼び出します。 |
スタックの遷移動作を順番に示すと、次のようになります。
- 引数 arg1 ~ argn が、順番にスタックにプッシュされます。
- オブジェクトを作成するために、引数 argn ~ arg1 がスタックからポップされ、 ctor に渡されます。
- 新しいオブジェクトへの参照が、スタックにプッシュされます。
newobj 命令は、新しいオブジェクトまたは値型の新しいインスタンスを作成します。 Ctor は、呼び出すコンストラクタの名前、クラス、およびシグネチャを示すメタデータ トークン (コンストラクタとしてマークしておく必要がある methodref または methoddef) です。
newobj 命令は、 ctor に関連付けられたクラスの新しいインスタンスを割り当て、必要に応じて、新しいインスタンスのすべてのフィールドを適切な型の 0 に初期化するか、または null 参照にします。次に、指定の引数と新しく作成されたインスタンスを使用して、コンストラクタ ctor を呼び出します。コンストラクタが呼び出されると、初期化されたオブジェクト参照 (O 型) がスタックにプッシュされます。
コンストラクタの視点から見ると、初期化されていないオブジェクトは引数 0 であり、newobj に渡されたその他の引数が順番に続きます。
インデックス番号が 0 から始まるすべての 1 次元配列は、 newobj ではなく、 Newarr を使用して作成されます。これに対し、その他のすべての配列 (多次元配列またはインデックス番号が 0 以外から始まる 1 次元配列) は、 newobj を使用して作成されます。
通常、値型は、 newobj を使用して作成されることはありません。値型は、通常、 newarr (インデックス番号が 0 から始まる、1 次元配列の場合) を使用して引数またはローカル変数として、あるいはオブジェクトのフィールドとして割り当てられます。割り当てられると、値型は Initobj を使用して初期化されます。ただし、 newobj 命令を使用して、値型の新しいインスタンスをスタック上に作成し、それを引数として渡したり、ローカルに格納したりできます。
要求を満たすにはメモリが不足している場合は、 OutOfMemoryException がスローされます。
指定した名前、クラス、およびシグネチャを持つコンストラクタ メソッド ctor が見つからなかった場合は、 MissingMethodException がスローされます。これは、通常、実行時ではなく、MSIL (Microsoft Intermediate Language) 命令がネイティブ コードに変換されるときに検出されます。
newobj オペコードを使用できる Emit コンストラクタ オーバーロードを次に示します。
- ILGenerator.Emit(OpCode, ConstructorInfo)
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ