2011-04-19 13 views
7

Duplicar posibles:
What's the difference between an object initializer and a constructor?constructores frente a Initializors en C#

en C# se puede construir un objeto como:

public class MyObject{ 

    int val1; 
    int val2; 

    public MyObject(int val1, val2){ 
      this.val1 = val1; 
      this.val2 = val2; 
    } 
} 

Con:

MyObject ob = new MyObject(1,2); 

o con:

MyObject ob = new MyObject(){ val1 = 1, val2 = 2 }; 

Cuál es la diferencia entre ese tipo de constructores?

+1

español por casualidad :) –

+1

Hice esta misma pregunta hace un tiempo. http://stackoverflow.com/questions/740658/whats-the-difference-between-an-object-initializer-and-a-constructor Compruebe aquí para obtener más información en profundidad, además de las respuestas aquí. – Pete

+4

Es sorprendente que el error de "nuevo Objeto()" en lugar de "nuevo MyObject()" lo haya convertido en cada respuesta. – juharr

Respuesta

18
MyObject ob = new MyObject(){ val1 = 1, val2 = 2 }; 

es sólo azúcar sintáctico (es decir abreviada) para

MyObject ob = new MyObject(); 
ob.val1 = 1; 
ob.val2 = 2; 

Una diferencia entre los dos es que se puede establecer readonly campos de la constructora, pero no mediante el uso de la taquigrafía.

Una segunda diferencia es que un constructor con parámetros obliga al cliente a proporcionar esos valores. Ver Constructor-injection vs. Setter injection para una buena lectura de fondo.

+0

tenga en cuenta que() se puede dejar aquí. Entonces MyObject ob = new Object() {val1 = 1, val2 = 2}; puede ser MyObject ob = new Object {val1 = 1, val2 = 2}; – Rob

4
MyObject ob = new Object(1,2); 

Esto es construir el objeto y hacer algo con los valores en el constructor. Tal vez establezca los valores, puede que no. Depende de la lógica en el constructor.

MyObject ob = new Object(){ val1 = 1, val2 = 2 }; 

Este está construyendo el objeto utilizando el constructor por defecto, y el establecimiento de valores iniciales para las propiedades, después de que el objeto ha sido construido. En este escenario, establecer los valores no tiene nada que ver con el constructor además del hecho de que está en la misma declaración. Es lo mismo que:

MyObject ob = new Object(); 
ob.val1 = 1; 
... 

Lo que es bueno de esta sintaxis es que se puede hacer:

Object ob = new Object(){ val1 = 1, val2 = 2 }; 

en lugar de tener que hacer:

Object ob = new Object(1,2); 
((MyObject)ob).val1 = 1; //note having to cast. 
... 

debido a que la inicialización de las variables sucede sin tocar la asignación de variable.

1

La segunda forma

MyObject ob = new Object(){ val1 = 1, val2 = 2 }; 

es la sintaxis para

MyObject ob = new Object(); 
    ob.val1 = 1; 
    ob.val2 = 2; 

el punto clave es que el ajuste de los valores es no parte del constructor.

7

La diferencia es probablemente que el segundo no se compilará.

Falta un constructor predeterminado, que llama en su segundo ejemplo.

+0

+1 buena llamada! El ctor predeterminado debe definirse –

+0

Hubo un error nuevo MyObject al lado del nuevo objeto – Caipivara

1

El primero es un parámetro ctor

MyObject ob = new MyObject (1,2); 

El segundo es el ctor predeterminado (parámetro cero), pero una vez que el acabados ctor, val1 y val2 se inicializan con los valores proporcionados

MyObject ob = new MyObject(){ val1 = 1, val2 = 2 }; 

Además, puede llamar al segundo sin llaves. P.ej.

MyObject ob = new MyObject { val1 = 1, val2 = 2 }; 
1

Ambos no son lo mismo.

Este constructor de la clase está invocando:

MyObject ob = new Object(1,2); 

Y esto es un inicializador objeto en línea:

MyObject ob = new Object(){ val1 = 1, val2 = 2 }; 

En primer lugar asegura la creación de una instancia de MyObject requiere dos parámetros de entrada número entero durante el tiempo de construcción, mientras que la otro, simplemente inicializa algunos campos o propiedades después del tiempo de construcción. El último mantiene la libertad de no necesariamente inicializar tales propiedades y/o campos.

Cuestiones relacionadas