以下两种方式创建对象有什么区别吗?
Student s1 = Activator.CreateInstance<Student>();
Student s1 = new Student();
- 构造函数的调用方式和初始化内存的方式有什么区别吗?
- 据我理解,第一种方法看起来完全是多余的。如果程序员在设计时知道数据类型,他将使用第二种方法。
以下两种方式创建对象有什么区别吗?
Student s1 = Activator.CreateInstance<Student>();
Student s1 = new Student();
这个 "Activator.CreateInstance" 方法的重载是由编译器使用的,用于通过泛型来实现类型参数指定的类型的实例化。
假设你有以下方法:
public static T Factory<T>() where T: new()
{
return new T();
}
Activator.CreateInstance()
是多余的。如果您知道类型,那么确实只需要使用new
。然而,在需要从插件框架动态加载未知类型或者从字符串(例如设置文件)中解析类型的情况下,它非常有用。至于两者之间的区别,调用new T()
和Activator.CreateInstance<T>()
在内部没有真正的区别,就像Andrew Hare已经指出的那样。编辑:不要紧,我已经混淆了通常更常用的 CreateInstance(Type type)
。一个主要的区别是
Student s1 = new Student();
Student
没有默认构造函数,则无法编译,而…Student s1 = Activator.CreateInstance<Student>();
Student
没有默认构造函数也会编译。(程序将编译并让你运行,但如果没有匹配的构造函数,你将得到一个异常。而如果构造函数不存在,则构造函数调用甚至不能编译。)CreateInstance
调用是对类的隐式使用,因此例如Resharper将不知道你正在实例化它,并可能告诉你该类从未被实例化。CreateInstance
调用还允许使用泛型类型参数:T s1 = Activator.CreateInstance<T>();
虽然使用 new
类型约束可能更好,因为它可以在编译时确保实际上存在要调用的构造函数。
但是,Activator.CreateInstance(Type, ...)
重载要更加实用。
从性能角度来看,调用new更好。CreateInstance可能使用反射,这会很慢。
如果您在设计时知道类型,请使用new,即使两个调用完全相同(它们并不相同!)为什么要让代码变得过于复杂呢?
仅在您在设计时不知道T的类型且需要运行时解析类型时使用Activator.CreateInstance
。
Activator.CreateInstance<T>
只是在内部调用默认构造函数。你的示例之间唯一的区别是多了一个CreateInstance<T>
方法调用。Activator.CreateInstance<T>
: