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.
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.