Estou voltando depois de muito tempo sem escrever. Não é difícil notar a dificuldade de se manter um blog. Pensar no que escrever as vezes é fácil, o problema é colocar no papel, ou melhor, na tela.

Ultimamente tenho estudado C#3, que tem o LINQ como o grande 'boom' do novo framework. Contudo, uma das coisas que mais me intrigou até o momento é Extension methods.

Acredito que muitos já devem ter usando e/ou criado static classes como classes utilitárias (util) ou auxliares (helpers) por que uma classe não possuia um método de que precisassemos no momento, ou até teria uma outra classe que executa a operação mas acaba gerando um overhead grande por que teria de instanciar um objeto que teria inúmeras operações que talvez não teria utilidade.

Um exemplo em Java é que os tipos Integer, Long e etc, não possui um conversor para bytes proprio da classe como getBytes() da String. Existe duas opções para realizar essa operação, uma delas é usar o BitInteger e a outra seria o DataOutputStream. Mas seria tão mais simples se tivessemos um getBytes() da classe String. Então recorre-se a uma classe auxliar para realizar essa conversão. Algo do tipo:

public class NumberHelper {
  public static byte[] intToBytes(int num);
  public static byte[] longToBytes(long num);
}

Um pouco feio mas resolve. Agora seria muito melhor ter algo do tipo Integer.toBytes(); ou Long.toBytes() não seria? Então é ai que entra o Extension methods.

No C#3 é possível criarmos uma classe estática que estenda os métodos de uma classe. É muito simples veja:

class Person {
  string Name { get; set; }
}

static class PersonUtil {
  public static void ChangeName(this Person p, string name) {
    p.Name = name;
  }
}

...
var fabio = new Person("Fabio");
fabio.ChangeName("Fábio");

Viram como é simples? Ok, o exemplo não é muito útil uma vez que o property set do Name é publico, mas estou sem idéia no momento. A idéia esta fresca na cabeça então estou escrevendo um post rápido.

Entretanto existem algumas restrições para isso:

  • A classe que contêm os Extension Methods não podem ser genêricos e internos, e os métodos precisam
  • ser static.
  • O método precisa ter pelo menos um paramêtro onde este (o primeiro) deve ser prefixado com this e
  • não pode ser ref, out ou ponteiro. Ou seja, os demais parâmetros (segundo, terceiro e etc) pode
  • ser genêricos, ref/out/ponteiro

Espero que tenham gostado do post, devo colocar outras coisas a mais sobre C#3 pois estou muito interessado nessas novidades.

Até um próximo post.