una que programacion objetos objeto metodos llamar inicializador ejemplos destruir crear como clases clase anonimos c# constructor object-initializers

que - objetos en c#



Constructor vs Precedencia de inicializador de objetos en C# (5)

De la documentation :

El compilador procesa los inicializadores de objetos accediendo primero al constructor de instancia predeterminado y luego procesando las inicializaciones de los miembros.

Esto significa que, en el caso más simple (llamada inicialización del objeto), es básicamente una abreviatura (o azúcar sintáctica) para llamar al constructor predeterminado y luego a los establecedores de propiedades. En el caso de los tipos anónimos, este tipo de inicialización es realmente necesario y no solo de azúcar.

Para la segunda parte de su pregunta: es más una cuestión de estilo, pero si tiene una propiedad crucial, no crearía un constructor con un valor predeterminado. Haga que el código del cliente establezca el valor explícitamente. Tampoco estoy seguro de por qué hacer algo como esto: b = A(true) {foo = false}; Sería una buena idea a menos que estés en un concurso de ofuscación de código.

Un poco de precaución, sin embargo:

... si el constructor predeterminado se declara privado en la clase, los inicializadores de objetos que requieren acceso público fallarán.

He estado aprendiendo el inicializador de objetos en C # recientemente, pero ahora me pregunto cómo funciona cuando entra en conflicto con el constructor.

public class A { public bool foo { get; set; } public A() { foo = true; } public A(bool bar) { foo = bar; } }

¿Qué pasa cuando intento esto?

public class B { a = A() {foo = false}; b = A(true) {foo = false}; }

¿Es un defecto en el constructor una buena manera de tener un bool que comienza como verdadero y se puede cambiar?

public A(bar=true) { foo = bar; }


El constructor se produce primero y luego el inicializador de objetos. Solo recuerda que

a = new A() { foo = false };

es igual que

var temp = new A(); temp.foo = false; a = temp;


Esencialmente lo que Pablo ya ha vinculado:

De la especificación de lenguaje C # 5 (7.6.10.1)

Processing of an object creation expression that includes an object initializer or collection initializer consists of first processing the instance constructor and then processing the member or element initializations specified by the object initializer or collection initializer.


Los inicializadores de objetos son solo azúcar sintáctica, en su ensamblaje compilado IL se traducen en declaraciones separadas, ILSpy en ILSpy .


b = new A(true) {foo = false};

es efectivamente corto para:

A temp = new A(true); temp.foo = false; A b = temp;

donde temp es una variable por lo demás inaccesible. El constructor siempre se ejecuta primero, seguido de cualquier propiedad inicializada.