当我对它的性能进行基准测试(T)FormatterServices.GetUninitializedObject(typeof(T))
时,它的速度较慢。同时编译的表达式会给你很大的速度改进,尽管它们只适用于具有默认构造函数的类型。我采用了混合方法:
public static class New<T>
{
public static readonly Func<T> Instance = Creator();
static Func<T> Creator()
{
Type t = typeof(T);
if (t == typeof(string))
return Expression.Lambda<Func<T>>(Expression.Constant(string.Empty)).Compile();
if (t.HasDefaultConstructor())
return Expression.Lambda<Func<T>>(Expression.New(t)).Compile();
return () => (T)FormatterServices.GetUninitializedObject(t);
}
}
public static bool HasDefaultConstructor(this Type t)
{
return t.IsValueType || t.GetConstructor(Type.EmptyTypes) != null;
}
这意味着 create 表达式被有效地缓存,并且仅在第一次加载类型时才会产生惩罚。也会以有效的方式处理值类型。
称它为:
MyType me = New<MyType>.Instance();
请注意,(T)FormatterServices.GetUninitializedObject(t)
字符串将失败。因此,对字符串进行了特殊处理以返回空字符串。