Khi bạn có mã như sau:Tại sao trình biên dịch C# phát ra Activator.CreateInstance khi gọi mới với một kiểu generic với một ràng buộc mới()?
static T GenericConstruct<T>() where T : new()
{
return new T();
}
Các biên dịch C# khăng khăng phát ra một lời kêu gọi Activator.CreateInstance, mà là chậm hơn đáng kể so với một constructor bản địa.
Tôi có cách giải quyết như sau:
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();
Nhưng nó không có ý nghĩa với tôi lý do tại sao việc này nên cần thiết.
Tôi cũng nhận thấy điều tương tự ... nhưng tôi không biết tại sao. –
Tôi đang sử dụng trình biên dịch đoạn mã và trình biên dịch không ném bất kỳ lỗi nào. Ngoài ra, hàm tạo được gọi khi hàm T() mới được gọi. – shahkalpesh
@shahkalpesh: Không ai nói rằng sẽ có lỗi. Vấn đề là Activator.CreateInstance chậm hơn so với biểu mẫu đại biểu. –