Sep 26 2007
Novidades no C# 3.0: Inicializadores de Objetos (Object Initializers)
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:

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:

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:

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:

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:

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.

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:

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.



























