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.








O que??
Você quer dizer que a Microsoft, em 2007, descobriu a clausula “With” que temos desde o Visual Basic 3.0???
:>)
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+
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
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!
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!
Marcos quando comentei no anteriormente seu comentárioa não tinha aparecido ainda. rsrs
vlw!