Objeto e coleção inicializadores (guia de programação de C#)

O inicializador de objetos permite que você atribua valores a quaisquer campos ou propriedades de um objeto e estes podem ser acessados na hora de criação sem explicitamente chamar um construtor. O exemplo a seguir mostra como usar o inicializador de objeto com um tipo nomeado, Cat. Observe o uso das propriedades de auto-implementada na Cat classe. Para obter mais informações, consulte Automático-Implementadas Propriedades (guia de programação C#).

private 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 objeto podem ser usados em qualquer contexto, são especialmente úteis em LINQ expressões de consulta. Expressões de consulta fazem uso freqüente de tipos anônimos, que só podem ser inicializados usando um inicializador de objeto, como mostrado na seguinte declaração.

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

Tipos anônimos permitem o select cláusula em um LINQ a expressão de consulta para transformar objetos da seqüência original em objetos cujo valor e a forma pode ser diferente da original. Isso é útil se você deseja armazenar apenas uma parte das informações de cada objeto em uma seqüência. O exemplo a seguir, suponha que um objeto de produto (p) contém muitos campos e métodos, e que você só estiver interessado na criação de uma seqüência de objetos que contêm o nome do produto e o preço da unidade.

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

Quando essa consulta é executada, o productInfos variável irá conter uma seqüência de objetos que podem ser acessados em um foreach instrução, 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 campos no objeto original. Você também pode renomear um campo quando você estiver criando um tipo anônimo; o exemplo a seguir renomeia o UnitPrice campo para Price.

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

Inicializadores de objeto com tipos anuláveis

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

Inicializadores de coleção

Inicializadores de coleção permitem que você especificar um ou mais intializers do elemento ao inicializar 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. Usando um inicializador de coleção não é necessário especificar várias chamadas para o Add método da classe em seu código de origem; o compilador adiciona as chamadas.

Os exemplos a seguir mostra 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 os inicializadores de objeto para inicializar objetos da Cat classe definida no exemplo anterior. Observe que os inicializadores de objeto individuais são colocados entre 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ê pode especificar Nulo como um elemento em um inicializador de coleção se a coleção Add método permite que o proprietário.

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
{
    private 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 de C#)

Conceitos

C# Programming Guide

LINQ Expressões de consulta (guia de programação de C#)

Histórico de alterações

Date

History

Motivo

Outubro de 2010

Adicionado um exemplo de uma declaração de tipo anônimo não é parte de uma consulta LINQ. Adicionado um link para um tópico que tem mais informações sobre tipos anônimos.

Comentários do cliente.