作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当你有如下代码时:
static T GenericConstruct<T>() where T : new()
{
return new T();
}
C# 编译器坚持发出对 Activator.CreateInstance 的调用,这比 native 构造函数慢得多。
我有以下解决方法:
public static class ParameterlessConstructor<T>
where T : new()
{
public static T Create()
{
return _func();
}
private static Func<T> CreateFunc()
{
return Expression.Lambda<Func<T>>( Expression.New( typeof( T ) ) ).Compile();
}
private static Func<T> _func = CreateFunc();
}
// Example:
// Foo foo = ParameterlessConstructor<Foo>.Create();
但我不明白为什么必须采用这种解决方法。
最佳答案
我怀疑这是一个 JITting 问题。目前,JIT 为所有引用类型参数重用相同的生成代码 - 所以 List<string>
的 vtable 指向与 List<Stream>
相同的机器代码.如果每个 new T()
都行不通调用必须在 JITted 代码中解决。
只是一个猜测,但它有一定的意义。
一个有趣的小点:在两种情况下,值类型的无参数构造函数都会被调用,如果有的话(这种情况非常罕见)。参见 my recent blog post了解详情。我不知道是否有任何方法可以在表达式树中强制它。
关于c# - 为什么 c# 编译器在使用具有 new() 约束的泛型类型调用 new 时发出 Activator.CreateInstance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58111736/
我是一名优秀的程序员,十分优秀!