当我对性能进行基准测试时,(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)
对于字符串将失败。因此,对字符串进行了特殊处理以返回空字符串。
FormatterServices.GetUninitializedObject
不允许创建未初始化的字符串。您可能会得到例外:System.ArgumentException: Uninitialized Strings cannot be created.
请记住这一点。