new c# specifications object-initializers

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.