Una diferencia grande es que
Student s1 = new Student();
no se compilará si no hay un constructor por defecto en Student
, mientras que
Student s1 = Activator.CreateInstance<Student>();
compilará incluso si Student
hace no tener un constructor por defecto (Compilará y le permitirá ejecutar el programa, pero si no hay un constructor que coincida obtendrá una excepción, mientras que la llamada del constructor ni siquiera se compilará si el constructor no existe)
Igualmente, la llamada CreateInstance
es un uso implícito de la clase, por lo que, por ejemplo, Resharper no sabrá que está instanciando, y podría decirle que la clase nunca se crea una instancia.
Como se ha mencionado en otras respuestas, la llamada CreateInstance
también permite el uso de un parámetro de tipo genérico:
T s1 = Activator.CreateInstance<T>();
aunque probablemente sería mejor usar una restricción new
tipo, ya que daría compilar -asegura de que realmente hay un constructor que se llamará.
Las sobrecargas Activator.CreateInstance(Type, ...)
son mucho más útiles, sin embargo.
Relacionados: http://stackoverflow.com/questions/6582259/fast-creation-of-objects-instead-of-activator-createinstancetype, http://stackoverflow.com/questions/6069661/does-system-activator -createinstancet-have-performance-issues-big-enough-to-di – nawfal