Object e Collection Initializers

Posted on March 27th, 2008

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 Cω.

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

Extension Methods

Posted on March 26th, 2008

Umas das novidades do C# 3.0 é a possibilidade de adicionar comportamento a uma classe sem a necessidade da criação de uma subclasse ou da recompilação do código original.

Essa funcionalidade é chamada de Extension Methods.

Criando um Extension Method

Imagine que você precisa validar se uma string é um e-mail válido. A solução mais comum é a definição de um método de validação (estático) em uma classe utilitária (estática).

static class Program
{
  static void Main(string[] args)
  {
    string emailCliente = System.Console.ReadLine();

    if (!Utilidades.IsEmailValido(emailCliente))
      System.Console.WriteLine("E-mail informado inválido.");
  }
}

Usando um Extension Method a solução é parecida, mas a utilização é mais elegante.

if (!emailCliente.IsEmailValido())
  System.Console.WriteLine("E-mail informado inválido.");

A criação do Extension Method se resume a definição de uma classe estática com um método estático.

namespace Utilidades
  public static class Extensoes
  {
    public static bool IsEmailValido(this string email)
    {
      return Regex.IsMatch(email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
    }
  }
}

Notem o keyword this antes da declaração do primeiro parâmetro. Ele é responsável por passar ao compilador que o método IsEmailValido é aplicável a todos os objetos do tipo string.

E para utilizar o extension method basta importar o namespace que contém a classe estática usando o statement using. Sendo que não é necessária a importação caso as classes estejam dentro do mesmo namespace.

using Utilidades;

Passando parâmetros para o Extension Method

namespace Utilidades
  public static class Extensoes
  {
    public static bool IsMaiorQue(this string s, int tamanho)
    {
      return s.Length > tamanho;
    }
  }
}

string nome = "Joao da Silva";

if (nome.IsMaiorQue(10))
  System.Console.WriteLn("Nome só pode ter 10 caracteres");

Com essa introdução dá para ter uma pequena idéia das possibilidades. Vale lembrar que também é possível criar extension methods para interfaces e generics.

Abaixo três boas referências que valem à pena dar uma lida.

SubSonic 2.1 Beta

Posted on February 7th, 2008

Rob Conery postou em seu blog o lançamento da versão 2.1 Beta 1 do framework.

Entre as novidades destaque para a implementação do pattern Repository e a nova Query Tool, uma fluent interface/DSL que vai permitir quem trabalha com o framework 2.0 ter um pouco da experiência do LINQ.

Também foi implementado o suporte ao carregamento parcial de objetos e o código do método Update foi alterado para somente atualizar as colunas que foram alteradas e evitar updates desnecessários.


Copyright © 2007 Algumas Idéias. All rights reserved.