不调用构造函数创建对象实例?

Chr*_*lum 63 c#

在C#中,有没有办法在不调用其构造函数的情况下实例化类的实例?

假设该类是公共的,并在第三方库中定义,构造函数是内部的.我想这样做的原因很复杂,但知道是否有可能使用某种C#hackery会很有帮助.

注意:我特别不想调用任何构造函数,因此使用反射访问内部构造函数不是一个选项.

Hal*_*rim 82

我没有尝试过,但有一个名为FormatterServices.GetUninitializedObject的方法,在反序列化过程中使用.

MSDN的评论说:

因为对象的新实例初始化为零并且没有运行构造函数,所以该对象可能不表示该对象认为有效的状态.

  • 我已经测试了这一点,并且可以确认FormatterServices.GetUninitializedObject()不会避免调用静态ctor.:( (6认同)
  • @JasonEvans我认为你不能阻止静态ctors运行,因为CLR在加载*type*时加载它们.如果没有加载它的类型,你根本无法真正引用一个类,所以我不确定你是如何绕过它的 (4认同)

Zac*_*tes 10

实际上,听起来他们将构造函数设置为内部,因此您无法实例化它.它可能有一个建造者或工厂方法.

看看这些文章:

防止第三方推导:第1部分

防止第三方推导:第2部分

他们有点解释推理.


小智 6

与许多人认为的相反,构造函数与对象的实例化没有多大关系(相当误导性的术语).构造函数是一种特殊方法,可以在对象实例化之后调用,以允许该对象正确初始化自身.在C++对象实例化中为对象分配内存,在.NET和Java中,它根据字段的类型(0,null,false等)分配和预初始化为默认值.然后运行时调用构造函数.新运算符将这两个单独的操作封装到看似单个操作的操作中.如果不使用构造函数就无法创建实例,那么反序列化在.NET中永远不会有效.也就是说,所谓的ConstructorInfo类型在调用其Invoke时充当新的运算符和构造函数(...