Novidades no C# 3.0: Inicializadores de Objetos (Object Initializers)

Publicado por Marcos Dell Antonio em 26/09/2007 | .NET

Mais um recurso que está disponível no C# 3.0 é o Inicializador de Objetos. Ele serve para situações onde é preciso criar um objeto e logo em seguida definir os valores das suas propriedades.

No C# 2.0 isto é feito da seguinte forma:

Inicialização de um objeto através das propriedades

O trecho de código acima instancia um objeto do tipo Computador e carrega as suas propriedades com alguns valores. Além desta forma de inicializar um objeto, existe outra onde a classe possui um construtor que recebe por parâmetro os valores das propriedades e então faz as atribuições, veja: 

Inicialização de um objeto através do construtor

Essas duas soluções funcionam perfeitamente (ainda bem), mas necessitam de muitas linhas de código. Além disso, se fosse necessário definir o valor de outra propriedade durante a criação do objeto, a segunda forma (utilizando construtores) precisaria de uma alteração no modelo (classe Computador). Um modo muito mais prático de fazer isto é utilizando o recurso de inicialização de objeto, desta forma:

Inicialização de um objeto utilizando Object Initializers

Esta forma é totalmente independente dos construtores da classe. Em outras palavras, se for preciso instanciar um objeto do tipo Computador com somente a propriedade Marca preenchida, basta fazer o seguinte:

Inicialização de somente uma propriedade do objeto utilizando Object Initializers

Análise do código gerado com o IL DASM 

Os testes foram realizados com as três formas de inicialização e seguindo o mesmo estilo do último exemplo: um objeto foi criado e atribuido o valor “HP” à propriedade Marca.  

Foi detectada uma grande semelhança no código gerado para os três testes. Na primeira situação, onde o objeto é criado e as propriedades são definidas logo em seguida, o código gerado é este:

IL DASM - código gerado para a inicialização de um objeto através das propriedades

Neste caso é criada uma instância da classe Computador, alocada a string “HP” na memória e chamado o método set_Marca para atribuir o valor à propriedade.

Quando a inicialização é feita utilizando o construtor, o número de linhas de código reduz visivelmente (veja na próxima figura). No entanto, qualquer propriedade que for preciso adicionar à inicialização exigirá uma alteração ou sobrecarga dele.

IL DASM - código gerado para a inicialização de um objeto através do construtor

Por fim, o código fonte gerado utilizando Object Initializers é muito parecido (pra não dizer igual) ao do primeiro teste. Ou seja, primeiro cria uma instância do objeto, aloca a string “HP” e depois chama o método set_Marca que define o valor da propriedade. Veja:

IL DASM - código gerado para a inicialização de um objeto utilizando Object Initializers

Concluindo o assunto, é extremante importante que fique claro qual é a finalidade do recurso Object Initializers. Ele não foi criado para substituir os construtores das classes. Apesar de fazer muito bem este papel em determinadas situações, sua principal utilidade é evitar a inicialização manual de propriedades após a criação do objeto e, consequentemente, reduzir o número de linhas de código.

7 comentários

  1. 1
    Caio Proiete // October 2nd, 2007 at 11:19 am

    O que??

    Você quer dizer que a Microsoft, em 2007, descobriu a clausula “With” que temos desde o Visual Basic 3.0???

    :>)

  2. 2
    Marcos Dell Antonio // October 2nd, 2007 at 12:27 pm

    Hum!!!

    Mas dá pra debugar no VB?

    No Delphi também existe o with, mas ele é até proibido em algumas empresas do setor pois não tem como debugar. :(

    T+

  3. 3
    Jorge Jeferson // March 1st, 2008 at 2:56 pm

    Caro amigo, me tire uma dúvida, não tem nada de errado na declaração dos métodos get e set na primeira imágem não??
    acho que na versão C# 2.0 a declaração “deveria ser” (eu acho) que

    public class computador{
    String marca;
    String modelo;
    String mouse;
    public String Marca{
    get{ return marca; }
    ser{ marca = value; }
    }
    public String Modelo{
    get{ return modelo; }
    set{ modelo = value; }
    }
    public String Mouse{
    get{ return mouse; }
    set{ mouse = value; }
    }
    }

    Desculpe se eu estiver errado…
    Abraçooooooooo

  4. 4
    Marcos Dell Antonio // March 2nd, 2008 at 12:41 pm

    Jorge,

    Eu acho que a imagem ficou confusa. Na verdade o que você deve notar nela é a forma de instanciar o objeto e não a declaração das propriedades. :)

    Mas você tem total razão: aquelas linhas de código não são do c# 2.0.

    Eu estou revisando todos os posts para voltar a blogar. Vou alterar este para deixar mais claro o exemplo.

    Valeu!

  5. 5
    Bobinha // March 2nd, 2008 at 2:19 pm

    O que Jorge Jeferson está falando é correto. A declaração da primeira imagem é recurso do C# 3.0 e não do 2.0.

    abraço!

  6. 6
    Bobinha // March 2nd, 2008 at 2:22 pm

    Marcos quando comentei no anteriormente seu comentárioa não tinha aparecido ainda. rsrs

    vlw!

  7. 7
    anonimouns // January 23rd, 2009 at 12:21 pm

    gosteii… mto pratico…eh noix

Deixe o seu comentário

Anúncios

Anúncio provido pelo BuscaPé