Inicializadores de objeto e coleção (Guia de Programação em C#)

Os inicializadores de objeto permitem atribuir valores a quaisquer campos ou propriedades acessíveis de um objeto na hora de criação sem que seja necessário invocar um construtor seguido por linhas de instruções de atribuição. A sintaxe do inicializador de objeto permite especificar argumentos para um construtor ou omitir os argumentos (e a sintaxe de parênteses). O exemplo a seguir mostra como usar um inicializador de objeto com um tipo nomeado Cat e como invocar o construtor padrão. Observe o uso de propriedades autoimplementadas na classe Cat. Para obter mais informações, consulte Propriedades autoimplementadas (Guia de Programação em 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 com tipos anônimos

Embora os inicializadores de objetos possam ser usados em qualquer contexto, eles são especialmente úteis em expressões de consultas LINQ. As expressões de consulta fazem uso frequente de tipos anônimos que apenas podem ser inicializados ao usar um inicializador de objeto, como mostrado na declaração a seguir.

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

Os tipos anônimos habilitam a cláusula select em uma expressão de consulta LINQ para transformar objetos da sequência original em objetos cujos valor e forma podem diferir dos originais. Isso será útil se você desejar armazenar apenas uma parte das informações de cada objeto em uma sequência. No exemplo a seguir, suponha que um objeto de produto (p) contenha vários campos e métodos e que você esteja apenas interessado em criar uma sequência de objetos que contenha o nome do produto e o preço unitário.

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

Quando essa consulta for executada, a variável productInfos conterá uma sequência de objetos que podem ser acessados em uma instrução foreach como mostrado neste exemplo:

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

Cada objeto no novo tipo anônimo tem duas propriedades públicas que recebem os mesmos nomes que as propriedades ou os campos no objeto original. Você também poderá renomear um campo quando estiver criando um tipo anônimo; o exemplo a seguir renomeia o campo UnitPrice como Price.

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

Inicializadores de objeto com tipos anuláveis

É um erro de tempo de compilação usar um inicializador de objeto com um struct anulável.

Inicializadores de coleção

Os inicializadores de coleção permitem especificar um ou mais inicializadores de elemento quando você inicializa uma classe de coleção que implementa IEnumerable. Os inicializadores de elemento podem ser um valor simples, uma expressão ou um inicializador de objeto. Ao usar um inicializador de coleção, não é necessário especificar várias chamadas para o método Add da classe em seu código-fonte; o compilador adiciona as chamadas.

Os exemplos a seguir mostram dois inicializadores de coleção 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() };

O inicializador de coleção a seguir usa inicializadores de objeto para inicializar objetos da classe Cat definida em um exemplo anterior. Observe que os inicializadores de objeto individuais são envolvidos por chaves e separados por vírgulas.

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

Você poderá especificar nulo como um elemento em um inicializador de coleção se o método Add da coleção permitir.

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

Exemplo

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

Consulte também

Referência

Tipos anônimos (Guia de Programação em C#)

Conceitos

Guia de Programação em C#

Expressões de consulta LINQ (Guia de Programação em C#)