表达式树是否等同于FormatterServices.GetUninitializedObject()?

时间:2015-02-12 05:48:45

标签: c# serialization reflection internals linq-expressions

通常我会调用Expression.New(type),但是当某个类型没有无参数构造函数时,这是不可能的。

  • FormatterServices.GetUninitializedObject()如何在内部工作?
  • 调用operator new()比调用FormatterServices.GetUninitializeObject()更快吗?
  • 是否Expressions等同于GetUninitializedObject,或者唯一的方法是使用Expression.Call吗?

1 个答案:

答案 0 :(得分:1)

来自MSDN

  

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

所以,回答你的问题:

  1. 我查看了使用ILSpy的方法,它所做的只是几个检查,然后调用本机(C ++我假设)方法。我猜它只是为对象分配了足够的内存,将所有字段初始化为零/ null,然后返回指向该对象的指针。没有构造函数被调用。
  2. 假设new()构造函数什么都不做,它们可能大致相同。
  3. 否。您必须使用Expression.Call,如果您想对任何类型的object执行任何操作,那么它将返回Expression.Convert