以下两种创建对象的方法有什么区别吗?
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
我不会说Activator.CreateInstance()多余的.
如果您知道类型,是的,您只需使用new.但是,在需要从插件框架动态加载未知类型或从字符串(例如,设置文件)解析类型的情况下,它非常有用.
并回答了一个问题,两者之间的差别,不,引擎盖下有调用之间没有真正的区别new T()和Activator.CreateInstance<T>(),正如已经指出的安德鲁野兔.
编辑:没关系,我把通用CreateInstance<T>()与其他更常用的通用混淆了CreateInstance(Type type)
调用 new 的性能更好 CreateInstance 可能使用反射,但速度很慢。
如果您在设计时知道类型 - 使用 new,即使两个调用完全相同(它们不是!),为什么要使您的代码过于复杂?
Activator.CreateInstance仅当您在设计时不知道 的类型T并且需要运行时解析该类型时才使用。
一个很大的区别是
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, ...)更有用。
| 归档时间: |
|
| 查看次数: |
12569 次 |
| 最近记录: |