当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《不调用构造函数创建对象实例?》经验,为你挑选了3个好方法。

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

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

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



1> Hallgrim..:

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

MSDN的评论说:

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


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

2> Zachary Yate..:

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

看看这些文章:

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

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

他们有点解释推理.



3> 小智..:

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

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有