Activator.CreateInstance VS新(Activator.CreateIn

2019-09-02 13:40发布

是否有下面创建一个对象的两种方式有什么区别。

Student s1 = Activator.CreateInstance<Student>();
Student s1 = new Student();
  • 有没有在路上调用构造函数或初始化存储器有什么区别?
  • 按我的理解,第一种方法看起来完全是多余的。 如果程序员知道在设计时的数据类型,他将使用第二种方法。

Answer 1:

了“的此重载Activator.CreateInstance ”方法被用于由编译器来实现的,通过使用泛型类型参数指定类型实例化。

假设你有下面的方法:

public static T Factory<T>() where T: new()
{
    return new T();
}

编译器将其转换“回归新T();” 调用“的CreateInstance”。

一般来说,对于在应用程序代码的CreateInstance没有用,因为这个类型必须在编译时是已知的。 如果类型是在编译时已知的,正常实例语法可用于(在C#,新在Visual Basic,gcnew在C ++新操作符)。

更多信息: http://msdn.microsoft.com/en-us/library/0hcyx2kd.aspx



Answer 2:

我不会把Activator.CreateInstance()是多余的。

如果您知道是什么类型,是的,你只需要使用new 。 然而,在需要的情况未知类型的动态加载插件从框架或者类型是从一个字符串解析(,比如说,从一个设置文件),这是非常有用的。

并回答了一个问题,两者之间的差别,不,引擎盖下有调用之间没有真正的区别new T()Activator.CreateInstance<T>()正如已经指出的安德鲁野兔。

编辑:没关系,我已经混淆了通用CreateInstance<T>()与其它的更通常使用CreateInstance(Type type)



Answer 3:

呼唤新的更好的性能,明智的CreateInstance可能使用反射是缓慢的。
如果你知道在设计时的类型 - 使用新的,即使两个电话都是完全一样的(他们不!)为什么过度复杂的代码?

使用Activator.CreateInstance只有当你不知道T在设计时类型和所需类型的运行时分辨率。



Answer 4:

不, Activator.CreateInstance<T>只是调用覆盖下的默认构造函数。 你的例子之间的唯一区别是一个额外的方法调用CreateInstance<T>

Activator.CreateInstance<T>

创建由指定的一般类型参数指定,使用参数构造的类型的实例。



Answer 5:

一个大区别是,

Student s1 = new Student();

将不能编译,如果有就没有默认构造函数Student ,而

Student s1 = Activator.CreateInstance<Student>();

将编译即使Student没有一个默认的构造函数。 (这将汇编,让你运行该程序,但如果没有匹配的构造函数,你会得到一个异常,而如果构造不存在构造函数调用甚至不会编译。)

同样, CreateInstance调用类的隐式使用,因此,例如,ReSharper的将不知道你是实例化它,可能会告诉你的是,类从不实例。

正如在其他的答案中提到的CreateInstance调用也允许使用泛型类型参数:

T s1 = Activator.CreateInstance<T>();

虽然你可能会更好使用一个new类型约束,因为它会给你编译时保证,实际上还有一种被称为构造函数。

Activator.CreateInstance(Type, ...)重载是更加有用,但是。



文章来源: Activator.CreateInstance Vs new