c# - new - Sintaxis del inicializador de objetos anidados
object initializer java (1)
Resharper acaba de sugerirme la siguiente refactorización:
// Constructor initializes InitializedProperty but
// the UninitializedSubproperty is uninitialized.
var myInstance = new MyClass();
myInstance.InitializedProperty.UninitializedSubproperty = new MyOtherClass();
// becomes
var myInstance = new MyClass
{
InitializedProperty = { UninitializedSubproperty = new MyOtherClass() }
};
Nunca antes había visto este tipo de inicialización de objetos. En particular, no veo cómo
InitializedProperty = { UninitializedSubproperty = new MyOtherClass() }
tiene sentido, no está asignando nada a InitializedProperty
.
¿Este comportamiento está especificado en alguna parte?
Esta sintaxis se llama Inicialización de objetos . La especificación C # claramente da muchos ejemplos sobre este tema:
7.6.10.2 Inicializadores de objetos
Un inicializador de objetos consiste en una secuencia de inicializadores de miembros, encerrados por {y} tokens y separados por comas. Cada inicializador miembro debe nombrar un campo o propiedad accesible del objeto que se está inicializando, seguido por un signo igual y una expresión o un inicializador de objeto o inicializador de colección. Es un error que un inicializador de objeto incluya más de un inicializador de miembro para el mismo campo o propiedad. No es posible que el inicializador de objetos haga referencia al objeto recién creado que está inicializando.
Los ejemplos son:
Rectangle r = new Rectangle
{
P1 = { X = 0, Y = 1 },
P2 = { X = 2, Y = 3 }
};
Compila hasta:
Rectangle r = new Rectangle();
r.P1.X = 0;
r.P1.Y = 1;
r.P2.X = 2;
r.P2.Y = 3;
Teniendo:
public class Rectangle
{
public Rectangle()
{
P1 = new Point(); //default Point for demo purpose
P2 = new Point(); //default Point for demo purpose
}
public Point P1 { get; set; }
public Point P2 { get; set; }
}
y
public class Point
{
public int X { get; set; }
public int Y { get; set; }
}
También considere leer un gran capítulo 8.3 Inicialización simplificada en C # en el libro de profundidad . Jon Skeet brinda otra mirada a las ventajas de usar este tipo de sintaxis para inicializar estructuras parecidas a árboles.