给定“where T:new()”,“new T()”是否成立?在内部使用 Activator.CreateInstance 吗?
如果我有类型参数约束 new()
:
void Foo<T>() where T : new()
{
var t = new T();
}
new T()
是否真的会在内部使用 Activator.CreateInstance
方法(即反射)?
If I have a type parameter constraint new()
:
void Foo<T>() where T : new()
{
var t = new T();
}
Is it true that new T()
will internally use the Activator.CreateInstance
method (i.e. reflection)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
是的,这是真的。 编辑 2: 这里很好地解释了如何以及为什么。
http://www.simple-talk .com/community/blogs/simonc/archive/2010/11/17/95700.aspx
为了验证我编译了以下方法:
这是生成的使用 .NET 3.5 SP1 中的 C# 编译器编译时的 IL:
编辑: C# 4 编译器创建略有不同但相似的代码:
对于值类型,它不使用激活器,而是使用激活器仅返回
default(T)
值,否则它会调用Activator.CreateInstance
方法。Yes, this is true. Edit 2: Here's a good explanation of the how and why.
http://www.simple-talk.com/community/blogs/simonc/archive/2010/11/17/95700.aspx
For verification I compiled the following method:
And this is the generated IL when compiled with the C# compiler in .NET 3.5 SP1:
Edit: The C# 4 compiler creates slightly different, but similar, code:
In the case of a value type it doesn't use the activator but just returns the
default(T)
value, otherwise it invokes theActivator.CreateInstance
method.是的。它适用于引用类型。
在以下发布编译的代码上使用 ILSpy:
Yielded
或在 C# 中:
JIT 将为传入的每个不同值类型参数创建不同的编译指令,但将对引用类型使用相同的指令 - 因此 Activator.CreateInstance()
Yes. It does for reference types.
Using ILSpy on the following release-compiled code:
Yielded
Or in C#:
JIT will create different compiled instructions for each different value type parameter passed in, but will use the same instructions for reference types -- hence the Activator.CreateInstance()