¿Cuál es realmente la diferencia entre los dos fragmentos de código siguientes?
Object o = Activator.CreateInstance(typeof(StringBuilder)); StringBuilder sb = (StringBuilder) o;y
StringBuilder sb = new StringBuilder();Desde un punto de vista práctico. No hay diferencia.
Sin embargo, desde un punto de vista técnico. El primero incurrirá en una penalización de rendimiento sustancial.
Primero, desde Activator.CreateInstance , ya que esta es una llamada de Reflection.
Luego, otro golpe de rendimiento cuando lanzas un object a StringBuilder .
Sin embargo, desde el punto de vista del diseño. Activator.CreateInstance toma Type como parámetro...
Esto significa que puede hacer lo siguiente...
public IStringBuilder ActivateStringBuilder(Type builderType) { return (IStringBuilder) Activator.CreateInstance(builderType); } Ignorando que no existe tal cosa como IStringBuilder , el código anterior le permite, en tiempo de ejecución, cambiar el comportamiento del código, pasando diferentes Type que implementan IStringBuilder .
Esta es la base para la inyección de dependencia (aunque tendemos a usar mecanismos mucho más complicados para sortear los problemas de rendimiento que señalé).