Inicializadores de objeto y de colección (Guía de programación de C#)

Actualización: noviembre 2007

Los inicializadores de objeto permiten asignar valores a los campos o propiedades accesibles de un objeto en el momento de la creación sin tener que invocar explícitamente un constructor. En el ejemplo siguiente se muestra cómo utilizar un inicializador de objeto con un tipo con nombre. Tenga en cuenta el uso de propiedades auto implementadas en la clase Test. Para obtener más información, consulte Propiedades autoimplementadas (Guía de programación de C#).

private class Cat
{
    // Auto-implemented properties
    public int Age { get; set; }
    public string Name { get; set; }
}

static void MethodA()
{
    // Object initializer
    Cat cat = new Cat { Age = 10, Name = "Sylvester" };
}

Inicializadores de objeto con tipos anónimos

Aunque los inicializadores de objeto se pueden utilizar en cualquier contexto, son especialmente útiles en expresiones de consulta LINQ. Las expresiones de consulta utilizan con frecuencia tipos anónimos, que sólo se pueden inicializar con un inicializador de objeto. En la cláusula select, una expresión de consulta puede transformar objetos de la secuencia original en objetos cuyo valor y forma pueden ser distintos de los originales. Esto es muy útil si sólo desea almacenar una parte de la información en cada objeto de una secuencia. En el ejemplo siguiente se supone que un objeto de producto (p) contiene muchos campos y métodos, y el usuario sólo está interesado en crear una secuencia de objetos que contenga el nombre del producto y el precio por unidad.

var productInfos =
    from p in products
    select new { p.ProductName, p.UnitPrice };

Al ejecutar esta consulta, la variable productInfos contendrá una secuencia de objetos a la que se puede tener acceso en una instrucción foreach, como se muestra en este ejemplo:

foreach(var p in productInfos){...}

Cada objeto del nuevo tipo anónimo tiene dos propiedades públicas que reciben los mismos nombres que las propiedades o campos del objeto original. También puede cambiar el nombre de un campo al crear un tipo anónimo; en el ejemplo siguiente se cambia el nombre del campo UnitPrice a Price.

select new {p.ProductName, Price = p.UnitPrice};

Inicializadores de objeto con tipos que aceptan valores NULL

Es un error en tiempo de compilación utilizar un inicializador de colección con una estructura que acepta valores NULL.

Inicializadores de colección

Los inicializadores de colección permiten especificar uno o varios inicializadores de elemento al inicializar una clase de colección que implementa IEnumerable. Los inicializadores de elemento pueden ser un valor simple, una expresión o un inicializador de objeto. Si se utiliza un inicializador de colección, no es necesario especificar varias llamadas al método Add de la clase en el código fuente; el compilador agrega las llamadas.

En los ejemplos siguientes se muestran dos inicializadores de colección simples:

    List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    List<int> digits2 = new List<int> { 0 + 1, 12 % 3, MakeInt() };

El inicializador de colección siguiente utiliza inicializadores de objeto para inicializar los objetos de la clase Cat, que se define en un ejemplo anterior. Observe que los inicializadores de objeto individuales aparecen entre corchetes y separados por comas.

List<Cat> cats = new List<Cat>
{
    new Cat(){ Name="Sylvester", Age=8 },
    new Cat(){ Name="Whiskers", Age=2},
    new Cat() { Name="Sasha", Age=14}
};

Puede especificar null como elemento de un inicializador de colección si el método Add de la colección lo permite.

List<Cat> moreCats = new List<Cat>
{
    new Cat(){ Name="Furrytail", Age=5 },
    new Cat(){ Name="Peaches", Age=4},
    null
};

Vea también

Conceptos

Guía de programación de C#

Expresiones de consultas con LINQ (Guía de programación de C#)

Referencia

Tipos anónimos (Guía de programación de C#)