Mais uma novidade do C# 3.0 é a nova sintaxe para a inicialização de objetos e coleções.

Object Initializers

Agora podemos ao instanciar um objeto passar valores para as suas propriedades.

public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
} 

Pessoa joao = new Pessoa() { Nome = "João", Email = "joao@gmail.com" };
Pessoa maria = new Pessoa() { Nome = "Maria", Email = "maria@gmail.com" };

No exemplo acima, são instanciados dois objetos do tipo Pessoa, chamando o construtor padrão, e em seguida setadas as propriedades Nome e Email.

Tudo em uma única linha de código.

Também é possível passar parâmetros para o construtor, conforme o exemplo a seguir:

public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
  public int Idade { get; set; }
  public Pessoa(string nome)
  {
    this.Nome = nome;
  }
}
Pessoa pedro = new Pessoa("Pedro") {
  Email = "pedro@gmail.com",
  Idade = 20
};

Collection Initializers

Já nas coleções podemos passar um conjunto de objetos.

No exemplo abaixo a coleção pessoas é instanciada com os objetos joao, maria e pedro como os seus membros.

IList<Pessoa> pessoas = new List<Pessoa>() { joao, maria, pedro }

É aqui uma combinação das duas formas.

IList<Pessoa> pessoas = new List<Pessoa>() {
  joao, maria, pedro,
  new Pessoa() { Nome = "Jose", Email = "jose@gmail.com" }
}

Conclusão

Como vimos nesse segundo post, o C# 3.0 vem trazendo grandes melhorias para a implementação de um código mais legível e bonito.

Muitas dessas melhorias foram influenciadas por dois projetos da Microsoft Research, o F# e o .

Nesse post, Tomas Petricek detalha as novidades incorporadas no C# 3.0 vindas desses dois projetos.