2015-02-12 94 views
3

通常我会打电话Expression.New(type),但是当一个类型没有无参数构造函数时,这是不可能的。FormatterServices.GetUninitializedObject()是否存在等价的表达式树?

  • FormatterServices.GetUninitializedObject()FormatterServices.GetUninitializedObject()如何在内部工作?
  • 打电话operator new()要比打电话FormatterServices.GetUninitializeObject()快吗?
  • 是否有Expressions相当于GetUninitializedObject,或者唯一的方法就是使用Expression.Call来做它?

回答

1

MSDN

因为对象的新实例初始化为零,并且没有构造函数运行,对象可能不代表由该对象视为有效的状态。当用户打算立即填充所有字段时,当前方法应仅用于反序列化。它不会创建一个未初始化的字符串,因为创建一个不可变类型的空实例是没有用的。

因此,要回答你的问题:

  1. 我看着使用ILSpy的方法,并且它的作用是一对夫妇的检查,然后调用本机(C++我假设)方法。我猜它只是为对象分配足够的内存,将所有字段初始化为零/空值,然后返回指向该对象的指针。没有构造函数被调用。
  2. 假设new()构造函数什么也不做,他们可能是差不多的。
  3. 不需要。您将不得不使用Expression.Call,这将返回object然后如果您想对它做任何事Expression.Convert您需要的任何类型的对象。
+1

运营商新的速度更快了很多,因为它是一个JIT内在的和一个非常,非常常见的情况。 – usr 2015-02-20 18:24:43

相关问题