Wenn Sie Code wie den folgenden haben:Warum gibt der C# -Compiler Activator.CreateInstance aus, wenn er new mit einem generischen Typ mit einer neuen() Einschränkung aufruft?
static T GenericConstruct<T>() where T : new()
{
return new T();
}
Der C# -Compiler besteht darauf einen Anruf zu Activator.CreateInstance auf emittieren, die wesentlich langsamer als ein nativer Konstruktor ist.
Ich habe die folgende Abhilfe:
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();
Aber es macht keinen Sinn für mich machen, warum diese Abhilfe erforderlich sein sollte.
Ich bemerkte das gleiche ... aber ich weiß nicht warum. –
Ich benutze Snippet Compiler und der Compiler wirft keinen Fehler. Außerdem wird der Konstruktor aufgerufen, wenn new T() aufgerufen wird. – shahkalpesh
@shahkalpesh: Niemand hat gesagt, dass ein Fehler auftreten würde. Der Punkt ist, dass Activator.CreateInstance langsamer ist als das Delegate-Formular. –