quarta-feira, 17 de setembro de 2014

C# 6.0 (vNext) – Novas funcionalidades

Introdução

Vai-se aproximando o lançamento da nova versão da linguagem C# 6.0 (vNext) e muitos já estarão a pensar se devem adoptar a nova versão de imediato ou se devem aguardar algum tempo até ver se vale mesmo a pena.

Para dar uma ajuda, temos hoje um artigo sobre algumas das características e novas funcionalidades do C# vNext [1].

Para começar, a primeira novidade é que o novo compilador será open source. É verdade! Já se pode obter o código fonte da nova plataforma .NET Compiler Platform (“Roslyn”). A Microsoft já está a disponibilizar no CodePlex duas versões preview da nova plataforma de compiladores, uma para o Visual Studio 2013 e outra em conjunto com a versão preview também do seu novo IDE de desenvolvimento. Ambas as versões podem ser obtidas aqui.

[1] actualizadas até 10-Set-2014

Conteúdo

Primary Constructors

Os primary constructors são uma abreviação sintática para a criação de um construtor que automaticamente atribui valores a variáveis privadas de instância.

Actual

public class Point
{
    private int x, y;

    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

vNext

public class Point(int x, int y)
{
    private int x, y;
}

Melhorias nas Auto Properties

As melhorias consistem numa abreviação sintática para a criação de auto properties readonly e inicializadores.

Actual

public class Pessoa
{
    private string _nome = "Henrique";
    private string _apelido ="Rodrigues";

    public string Nome
    {
        get { return _nome; }
        set { _nome=value; }
    }

    public string Apelido
    {
        get { return _apelido; }  
    }
}

vNext

public class Pessoa
{
    public string Nome { get; set; } = "Henrique"

    public string Apelido { get; } = "Rodrigues"
}

Utilização de membros Static

Mais uma abreviação sintática, que permite utilizar os membros estáticos de uma classe (mesmo os extension methods) sem necessitar de referenciar explicitamente a classe. Basta indicá-la numa expressão using.

Actual

using System;

namespace vNext
{
    public class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("Hellow World");
        }
    }
}

vNext

using System.Console;

namespace vNext
{
    public class Program
    {
        static void Main(string[] args)
        {
            //usar o mtodo writeLine da classe Console
            //sem especificar o nome da classe
            WriteLine("Hellow World");
        }
    }
}

Expressões de declaração

Mais uma abreviação sintática, que permite declarar uma variável no meio duma expressão.

Actual

long id;
if (!long.TryParse(Request.QureyString["Id"], out id))
{ }

vNext

if (!long.TryParse(Request.QureyString["Id"], out long id))
{ }

Inicialização de Índices e de Dicionários

Nota: os inicializadores de índices (Index Initializers) – sinal $ - já tinham sido previamente previstos, mas não funcionam na CTP atual.

A inicialização de dicionários e outros objectos com indexadores é pouco elegante. Temos agora uma melhoria sintática que permite fazer esta inicialização duma forma mais clara.

Actual

Dictionary<string, string> antigo = new Dictionary<string, string>()
    {
        { "Portugal", "Lisboa" },
        { "Angola", "Luanda" },
        { "EUA", "Washington" }
    };

vNext

Dictionary<string, string> novo = new Dictionary<string, string>()
    {
        ["Portugal"] = "Lisboa",
        ["Angola"] = "Luanda",
        ["EUA"] = "Washington"
    };

Melhorias no tratamento de Excepções 

No tratamento de excepções, temos duas novidades:

  • Filtros de excepção (Exception Filters)
  • Chamadas assíncronas em blocos catch (await)

Exception Filters

try
{
    throw new Exception("Eu");
}
catch (Exception ex) if (ex.Message == "Tu")
{
    // este bloco no executa
}
catch (Exception ex) if (ex.Message == "Eu")
{
    // este bloco executa
}

await em blocos catch

try
{
    DoSomething();
}
catch (Exception)
{
    await LogService.LogAsync(ex);
}

Conclusões

Ao considerar apenas estas alterações de linguagem, percebemos que não há nada de particularmente revolucionário no C# 6.0. A grande novidade é mesmo a do compilador ser disponibilizado como open source.

Esta versão não vai revolucionar a codificação do C#, mas isso não significa que não tenham sido feitos progressos reais na eliminação de algumas ineficiências de codificação. Depois de se começar a usar estas novas funcionalidades, no dia-a-dia da programação, rapidamente se vão tornar como certas, como um dado adquirido.

Referências

http://msdn.microsoft.com/en-us/magazine/dn683793.aspx

https://roslyn.codeplex.com/

Language feature implementation status

C# feature descriptions

Sem comentários:

Enviar um comentário