Одно большое отличие состоит в том, что
Student s1 = new Student();
не будет компилироваться, если в Student
нет конструктора по умолчанию, тогда как
Student s1 = Activator.CreateInstance<Student>();
скомпилируется, даже если Student
не имеет конструктора по умолчанию. (Он скомпилируется и позволит вам запустить программу, но если нет подходящего конструктора, вы получите исключение, тогда как вызов конструктора даже не скомпилируется, если конструктор не существует.)
Аналогично, вызов CreateInstance
является неявным использованием класса, поэтому, например, Resharper не будет знать, что вы создаете его экземпляр, и может сказать, что экземпляр класса никогда не создается.
Как упоминалось в других ответах, вызов CreateInstance
также позволяет использовать параметр общего типа:
T s1 = Activator.CreateInstance<T>();
хотя вам, вероятно, будет лучше использовать ограничение типа new
, поскольку это даст вам уверенность во время компиляции, что на самом деле существует конструктор, который нужно вызвать.
Однако перегрузки Activator.CreateInstance(Type, ...)
гораздо более полезны.