gpt4 book ai didi

c# - 为什么 c# 编译器在使用具有 new() 约束的泛型类型调用 new 时发出 Activator.CreateInstance?

转载 作者:行者123 更新时间:2023-11-30 12:54:20 25 4
gpt4 key购买 nike

当你有如下代码时:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com