Activator.CreateInstance <T>对新的

Pal*_*ani 27 .net reflection

以下两种创建对象的方法有什么区别吗?

Student s1 = Activator.CreateInstance<Student>();
Student s1 = new Student();
Run Code Online (Sandbox Code Playgroud)
  • 调用构造函数或初始化内存的方式有什么不同吗?
  • 根据我的理解,第一种方法看起来完全是多余的.如果程序员在设计时知道数据类型,他将使用第二种方法.

Chr*_*ann 12

编译器使用" Activator.CreateInstance "方法的这种重载来实现使用泛型的类型参数指定的类型的实例化.

假设您有以下方法:

public static T Factory<T>() where T: new()
{
    return new T();
}
Run Code Online (Sandbox Code Playgroud)

编译器将转换"return new T();" 调用"CreateInstance".

通常,应用程序代码中的CreateInstance没有用处,因为必须在编译时知道该类型.如果在编译时已知类型,则可以使用正常的实例化语法(C#中的new运算符,Visual Basic中的New,C++中的gcnew).

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

  • 在编译时,类型是未知的是很常见的.在分离合同(接口)和实现时非常有用. (15认同)
  • 我会把最后一段说完全错.在配置中有一个typename并且需要实例化它是很常见的.我假设您特别指的是在编译时需要具体类型的泛型重载(在问题中使用). (2认同)
  • @ChadSchouggins是的,关于泛型是我的意思. (2认同)

J. *_*een 7

我不会说Activator.CreateInstance()多余的.

如果您知道类型,是的,您只需使用new.但是,在需要从插件框架动态加载未知类型或从字符串(例如,设置文件)解析类型的情况下,它非常有用.

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

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


Dro*_*per 5

调用 new 的性能更好 CreateInstance 可能使用反射,但速度很慢。
如果您在设计时知道类型 - 使用 new,即使两个调用完全相同(它们不是!),为什么要使您的代码过于复杂?

Activator.CreateInstance仅当您在设计时不知道 的类型T并且需要运行时解析该类型时才使用。


Dav*_*eau 5

一个很大的区别是

Student s1 = new Student();
Run Code Online (Sandbox Code Playgroud)

如果 上没有默认构造函数,则不会编译Student,而

Student s1 = Activator.CreateInstance<Student>();
Run Code Online (Sandbox Code Playgroud)

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

同样,CreateInstance调用是类的隐式使用,因此,例如,Resharper 不会知道您正在实例化它,并且可能会告诉您该类从未实例化。

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

T s1 = Activator.CreateInstance<T>();
Run Code Online (Sandbox Code Playgroud)

尽管使用类型约束可能会更好new,因为它可以在编译时保证实际上有一个构造函数被调用。

然而,重载Activator.CreateInstance(Type, ...)更有用。