OpCodes.Newobj 字段

定义

创建一个值类型的新对象或新实例,并将对象引用(O 类型)推送到计算堆栈上。

public: static initonly System::Reflection::Emit::OpCode Newobj;
public static readonly System.Reflection.Emit.OpCode Newobj;
 staticval mutable Newobj : System.Reflection.Emit.OpCode
Public Shared ReadOnly Newobj As OpCode 

字段值

注解

下表列出了指令的十六进制和 Microsoft 中间语言 (MSIL) 程序集格式,以及简短的参考摘要:

格式 程序集格式 说明
73 <T> newobj ctor 分配未初始化的对象或值类型,并调用构造函数方法 ctor

堆栈过渡行为(按顺序排列)是:

  1. 通过 argn 的参数arg1按顺序推送到堆栈上。

  2. 通过 arg1 的参数argn从堆栈中弹出,并传递到 以ctor创建对象。

  3. 对新对象的引用将推送到堆栈上。

指令 newobj 创建值类型的新对象或新实例。 Ctor 是 (methodrefmethoddef 的元数据标记,必须标记为构造函数) 指示要调用的构造函数的名称、类和签名。

指令 newobj 分配与 ctor 关联的 类的新实例,并根据需要将新实例中的所有字段初始化为 0 (的正确类型) 或 null 引用。 然后,它调用具有给定参数的构造函数 ctor 和新创建的实例。 调用构造函数后,现在初始化的对象引用 (类型 O) 推送到堆栈上。

从构造函数的角度来看,未初始化的对象是参数 0,传递给 newobj 的其他参数按顺序排列。

所有从零开始的一维数组都是使用 Newarr而不是 newobj创建的。 另一方面,所有其他数组 (多个维度,或者一维而不是从零开始的) 都是使用 newobj创建的。

值类型通常不是使用 newobj创建的。 它们通常分配为参数或局部变量,将 newarr (用于从零开始的一维数组) 或作为对象的字段。 分配后,它们将使用 Initobj进行初始化。 但是, newobj 指令可用于在堆栈上创建值类型的新实例,然后可将该实例作为参数传递,存储在本地中,依此类举。

OutOfMemoryException 如果内存不足,无法满足请求,则引发 。

MissingMethodException 如果找不到具有指定名称、类和签名的构造函数方法 ctor ,则引发 。 当 Microsoft 中间语言 (MSIL) 指令转换为本机代码而不是在运行时时,通常会检测到此情况。

以下 Emit 方法重载可以使用 newobj 操作码:

适用于