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

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, Cat.Tenga en cuenta el uso de propiedades auto implementadas en la clase Cat.Para obtener más información, vea Propiedades autoimplementadas (Guía de programación de C#).

class Cat
{
    // Auto-implemented properties.
    public int Age { get; set; }
    public string Name { get; set; }
}
Cat cat = new Cat { Age = 10, Name = "Fluffy" };

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 los tipos anónimos, que solo se pueden inicializar con un inicializador de objeto, como se muestra en la siguiente declaración.

var pet = new { Age = 10, Name = "Fluffy" };

Los tipos anónimos habilitan la cláusula select de una expresión de consulta de LINQ para transformar objetos de la secuencia original en objetos cuyo valor y forma pueden ser distintos de los originales.Esto es muy útil si solo desea almacenar una parte de la información de 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 para utilizar un inicializador de objeto con un struct que acepta valores NULL.

Inicializadores de colección

Los inicializadores de colección permiten especificar uno o más inicializadores de elemento cuando se inicializa 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
};

Ejemplo

// The following code consolidates examples from the topic.
class ObjInitializers
{
    class Cat
    {
        // Auto-implemented properties.
        public int Age { get; set; }
        public string Name { get; set; }
    }

    static void Main()
    {
        Cat cat = new Cat { Age = 10, Name = "Fluffy" };

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

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

        // Display results.
        System.Console.WriteLine(cat.Name);

        foreach (Cat c in cats)
            System.Console.WriteLine(c.Name);

        foreach (Cat c in moreCats)
            if (c != null)
                System.Console.WriteLine(c.Name);
            else
                System.Console.WriteLine("List element has null value.");
    }
    // Output:
    //Fluffy
    //Sylvester
    //Whiskers
    //Sasha
    //Furrytail
    //Peaches
    //List element has null value.
}

Vea también

Referencia

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

Conceptos

Guía de programación de C#

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