Melhorando a legibilidade do C# com Extension Methods

É difícil achar alguém que não goste da sintaxe do Ruby, é simples e agradável, tanto para ler quanto para escrever. Muitas vezes as instruções se tornam verdadeiras frases e parece que você está lendo um artigo e não um código. Olha como fica um loop em Ruby.

5.times { puts "Hi" }

“5 vezes imprima Hi”. O melhor de tudo é que é possível termos algo muito semelhante em C#, fica assim.

//New Style
5.Times((i) => {
    Console.WriteLine(i);
});

//Old Style
for(int i = 0; i < 5; i++) {
    Console.WriteLine(i);
}

Ok, um pouco mais verboso que o exemplo em Ruby, mas ainda assim é muito agradável. Para conseguirmos usar o exemplo acima é preciso incluir este pequeno extension method.

public static void Times(this int times, Action<int> action)
{
    for (int i = 0; i < times; i++)
        action(i);
}

Extension Methods, adoro :)
São várias as possibilidades de extensão, basta usar a criatividade.

//Loop de 5 até 10
5.To(10, (i) => {
    Console.WriteLine(i);
});

//string.IsNullOrEmpty() é chato demais, que tal isso?
string nome = "Guilherme";
if (nome.IsNullOrEmpty()) {
    Console.WriteLine("Nome está vazio");
}

//3.Minutes(), 10.Seconds(), 2.Hours(). nuff said
Thread.Sleep(3.Minutes());

A implementação fica assim.

public static bool IsNullOrEmpty(this string value)
{
    return string.IsNullOrEmpty(value);
}

public static void To(this int start, int end, Action<int> action)
{
    for (int i = start; i <= end; i++)
        action(i);
}

public static TimeSpan Minutes(this int minutes)
{
    return TimeSpan.FromMinutes(minutes);
}

public static TimeSpan Hours(this int hours)
{
    return TimeSpan.FromHours(hours);
}

public static TimeSpan Minutes(this int seconds)
{
    return TimeSpan.FromSeconds(seconds);
}

Dica: Quer conhecer uma infinidade de métodos legais e criativos? Este tópico no StackOverflow posusi vários métodos enviados pela comunidade. Escolhas os que mais lhe agradam. Tem também o projeto Fluent DateTime no CodePlex, pode ser útil para aqueles que precisam utilizar datas.

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Sharing Buttons by Linksku