9

Dado el siguiente ejemplo, ¿uno es objetivamente mejor/más rápido/más seguro que el otro? ¿Debería la instanciación literal de objetos ser una mejor práctica donde es práctico?¿La instanciación de objeto literal es más rápida que las propiedades de configuración?

¿Dónde es inadecuado?

class Person 
{ 
    public string name; 
    public int age; 
} 
void MakePeople() 
{ 
    Person myPerson = new Person(); 
    myPerson.name = "Steve"; 
    myPerson.age = 21; 

    Person literalPerson = new Person { name = "John", age = 22 }; 
} 
+3

La IL generada a partir de esos dos métodos debe ser idéntica. Entonces, no. –

+2

Una línea en lugar de tres y más claro acerca de la intención y el efecto. Podría ser 10 veces más lento y aún sería una buena idea. No puedo comprender la fijación de las personas en las pequeñas diferencias de rendimiento (como un enfoque predeterminado, estoy feliz de optimizar las zonas de conexión). – delnan

Respuesta

16

No, no es más rápido o más lento. Es lo mismo.

El compilador traduce los inicializadores de objeto a una llamada de constructor seguido de establecer esas propiedades.

Person literalPerson = new Person { name = "John", age = 22 }; 

turnos para:

Person myPerson = new Person(); 
myPerson.name = "John"; 
myPerson.age = 22; 

Usted debe usar lo que es más fácil de leer y lo que haya acordado con su equipo.

+2

+1 para usar lo que es más legible (especialmente para el entorno de equipo) – JYelton

+5

Técnicamente, no es exactamente lo mismo, ya que el compilador declara una variable temporal para mantener la asignación a su variable atómica. –

+0

@KirkWoll ¿Es verdad incluso en el caso anterior donde 'Persona' es un tipo de referencia? –

0

Si echas un vistazo a la IL que se genera, estoy bastante seguro de que encontrarás que son idénticas. Usar los inicializadores de objetos es solo un atajo de compilador.

1

Cualquiera es apropiado. Depende de lo que necesita hacer para establecer las propiedades. Por ejemplo, yo evitaría instanciación literal en los casos en que se necesita un poco de lógica para llegar a un valor de propiedad:

Person myPerson = new Person(); 
myPerson.SomeProperty = if IsNewPerson ? GetPropertyFromDatabase() : GetDefaultProperty(); 

Editar:

Una ventaja de usar la inicialización del objeto literal en Visual Studio es que Intellisense pedirá propiedades, mostrando solo aquellas que aún no han sido declaradas. (He encontrado código en el que se asignó un valor de forma redundante al establecer propiedades).

+1

Eso solo es una preferencia personal. Todavía puedes hacer eso usando la inicialización literal. – Servy

+0

Podría, pero se vuelve mucho menos legible. – JYelton

+0

Y la legibilidad es una cuestión de preferencia. Mi punto no es que esto sea malo, solo que el código generado sigue siendo el mismo, incluso en tu ejemplo. – Servy

0

No creo que la velocidad sea lo que impulse esta decisión. Probablemente hay muy poca diferencia entre la velocidad de cualquiera de los métodos.

Creo que la legibilidad del código debería ser el factor principal en el camino que se debe seguir. Usando ese criterio, creo que son muy cercanos y se reduce a preferencias personales o lo que decida tu equipo. Sin embargo, creo que en el caso de que un objeto con muchas propiedades se establezca, llamar explícitamente a setters es un poco más legible.

Cuestiones relacionadas