C# - 为什么一个类的 new() 约束要使用 Activator.CreateInstance<T>()?

5

可能的原因是类型T直到运行时才能确定。 - Rahul
如果它没有默认构造函数,您将无法将其与需要存在一个构造函数的方法一起使用。 - Lasse V. Karlsen
重复问题的答案中的博客文章包含了大量信息 - https://www.simple-talk.com/blogs/2010/11/17/subterranean-il-constructor-constraints/ - Lasse V. Karlsen
2
这不是重复,那篇文章只是给了一些IL的理由,我想问为什么不行? - halivingston
叹气,1000万个并非完全重复的问题。 - Hans Passant
显示剩余2条评论
1个回答

2
在CIL中没有这样的指令(http://www.ecma-international.org/publications/standards/Ecma-335.htm)。
假设我们可以添加一个指令,这样另一种实现方式是在类型的VTable中将默认构造函数索引为索引0,然后JIT可以假定这个信息并生成代码,执行VTable查找,选择索引0,并调用由VTable中索引0指向的地址处的函数。
正如你所看到的,这需要对CLR数据结构进行更改,可能需要每个对象的布局,以及可能需要对值类型使用不同的解决方案(我忽略了该情况,因为你明确说了类和new())。

1
而 JIT 可以优化 CreateInstance 调用,从而实现最佳性能。不知道是否已经执行了此操作。可能没有,因为我们正在谈论 .NET JIT。如果有疑问,最好不要进行优化。更新:事实证明,C# 编译器会执行这个优化的一部分,因为 JIT 没有成功:https://www.simple-talk.com/blogs/2010/11/17/subterranean-il-constructor-constraints/ - usr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接