Visual Studio 2008 e .NET Framework 3.5 (Parte 1)

Introdução

Esta é a primeira parte de um artigo que pretende fazer com que o leitor compreenda as novidades introduzidas na .NET Framework 3.5 bem como algumas das novidades do Visual Studio 2008.

Contudo, dada a extensão do tema, foi necessário dividi-lo em duas partes. Ambas as partes serão bastante práticas sendo apresentados exemplos de forma a que o leitor os possa usar como uma base de evolução.

Todos os exemplos deste artigo são para a linguagem C#. Contudo as mesmas novidades existem para VB.NET e Visual C++.

Fica aqui um pequeno aperitivo da segunda parte: Windows Presentation Foundation, Windows Workflow Foundation e ASP.NET 3.5.

Evolução da .NET Framework

A .NET Framework surgiu nos inícios de 2001 aquando do lançamento do Visual Studio 2002. Na .NET 1.0 vinha as primeiras versões do C#, VB.NET.

Em meados de 2003 a Microsoft lançou o Visual Studio 2003 e com ele veio uma nova versão da .NET Framework a .NET 1.1. Essa versão da .NET Framework veio corrigir alguns problemas da versão anterior bem como introduzir algumas novidades ao nível das linguagens de programação.

Em 2005 é lançado Visual Studio 2005e com ele veio a .NET 2.0 e o C# 2.0. Esta versão da framework trouxe muitas novidades e melhorias em relação à anterior e a nível do C# as novidades foram imensas o que contribuíram para que esta linguagem se tornasse ainda mais atractiva.

Em finais de 2006 e 2007 saíram as duas ultimas versões da .NET Framework a 3.0 e a 3.5. Com a .NET 3.5 saiu a versão 3.0 do C# e a versão 9.0 do VB.NET.

Na Figura abaixo o leitor pode ser a evolução da .NET Framework.

Visual Studio 2008 e .NET Framework 3.5: evolução do .Net

O que é a .NET Framework 3.5

A .NET Framework tem sido adoptada pela comunidade de desenvolvimento desde o seu lançamento, em 2002. De forma a fornecer um melhor desempenho, flexibilidade e redução no trabalho de codificação, a Microsoft lança agora o .NET Framework 3.5.

A .NET Framework 3.5 tem dois elementos que são necessários entender: Os Bits vermelhos e os Bits verdes. Quando falamos em Bits vermelhos falamos em todas as funcionalidades existentes nas .NET Framework 2.0 e 3.0 bem como alguns updates a essas duas versões da .NET Framework.

Framework .Net 3.5

Mas esses updates não são a totalidade das novas funcionalidades mas sim mais um service pack com correcções de bugs e melhorias.

Os Bits verdes são o conjunto das novas funcionalidades e add-ons que foram introduzidos na .NET Framework.

Algumas dessas novas funcionalidades são:

  • LINQ – Facilita enormemente a consulta e manipulação de informação a nível de classes, objectos e da base de dados;
  • Visual Studio 2008 – Primeiro Visual Studio multi-targeting pois permite construir aplicações direccionadas a varia versões da .NET Framework, permite também o Debug de javascript com intellisense;
  • Windows Presentation Foundation – Designer integrado com o Visual Studio, edição visual de XAML com intellisense;
  • Varias ferramentas para dispositivos móveis – Unit testing para dispositivos móveis;
  • Device emulator 3.0.

Novidades da .NET Framework 3.5

Em 2005 fomos atraídos para o lançamento da segunda grande versão da .NET Framework que introduziu novidades tais como os generics, delegates anónimos, etc. Quando em 2006 foi apresentada a especificação do C# 3.0 todos tivemos a oportunidade de ver qual o caminho que a linguagem estava a seguir. Ao contrário do C# 2.0 que introduziu novas funcionalidades para se manter actualizado com o que de novo estava a surgir nas outras linguagens, o C# 3.0 veio introduzir funcionalidades radicais muitas das quais nunca tinham sido vistas em qualquer linguagem de programação. Pode-se dizer que o futuro da .NET Framewok não é só um futuro de evolução mas sim de revolução.

É com este impulso que vamos ver algumas dessas novidades.

Auto-Implemented Properties

Tradicionalmente a construção das propriedades nas classes requeria a construção das componentes Get e Set. Na maioria dos casos, esses componentes implementavam pouca lógica funcional, acabando por gerar alguma redundância de código nas aplicações.

Implementação das propriedades no C# 2.0

class Pessoa
{
  private string nome;
  private string apelido;
 
  public string Nome
  {
    get {return nome;}
    set {nome = value;}
  }
 
  public string Apelido
  {
    get {return apelido;}
    set {apelido = value;}
  }
}

No C# 3.0 podemos declarar as componentes Get e Set vazias. Quando isso acontece, o compilador gera automaticamente um campo privado para a classe e constrói uma implementação Get e Set públicas para a propriedade.

Implementação das propriedades no C# 3.0

class Pessoa
{
  public String Nome
  {
    get;
    set;
  }
 
  public String Apelido
  {
    get;
    set;
  }
}

Object Initialization

O C# 3.0 facilita enormemente a inicialização dos valores das propriedades. Anteriormente as propriedades tinham que ser inicializadas no construtor ou explicitamente após instanciar o objecto.

Inicialização das propriedades no C# 2.0

Pessoa antonio = new Pessoa();
antonio.Nome = "António";
antonio.Apelido = "Santos";

No C# 3.0 podemos usar a funcionalidades Object Initialization que permite indicar valores para as propriedades sem obrigar à utilização do construtor ou a atribuir valores de forma explícita.

Inicialização das propriedades no C# 3.0

Pessoa joao = new Pessoa
{
  Nome = "João",
  Apelido = "Sousa"
};

Extension Methods

Extension Methods são métodos adicionais que são definidos para complementar as funcionalidades dos tipos base. Permitem adicionar novos métodos aos tipos existentes na CLR sem ter que recorrer ao sub-classing ou à recompilação do tipo original. Desta forma podemos incrementar o âmbito funcional de tipos base de uma forma extremamente prática.

Criação de um Extension Method

public static class ValidarEmail
{
  public static bool emailValido(this string str)
  {
    Regex regex = new Regex(@"[w-.]+@([w-]+.)+[w-]{2,4}$");
    return regex.isMatch(str);
  }
}

Para definir os Extension Methods é necessário ter em consideração algumas coisas:

  • A classe que implementa os Extension Methods tem que ser estática para ser usada sem ser necessário instanciar;
  • O Extension Method é um método estático e recebe como parâmetro o tipo base que vamos extender;
  • O tipo a estender é antecedido pela keyword this para indicar ao compilador que o método deve ser adicionado aos métodos do tipo a estender.

Para usar a classe que contém os Extension Methods basta importá-la com o using. A partir desse momento o método passa a estar disponível para o tipo de dados que foi estendido.

Um exemplo interessante da aplicação dos Extension Methods é a adição de novos métodos aos objectos da .NET Framework. Por exemplo um dos métodos que podemos adicionar é um método In que permite validar se um objecto recebido como argumento é ou não parte do mesmo.

public static class ExtensaoIn
{
  public static bool In(this object obj, IEnumerable<object> col)
  {
    foreach(object o in col)
    {
      if (o.Equals(obj)) return true;
    }
    return false;
  }
}

Type Inference

No C# 3.0 a Microsoft introduziu uma nova keyword o var. Essa keyword permite declarar uma variável em que o seu tipo é implicitamente definido pela expressão usada para inicializar a variável.

Exemplo de uso do Type Inference

var i = 10;

No exemplo acima o valor 10 é armazenado na variável i e esta é definida como inteira. A declaração de variáveis usando var permite utilizar as variáveis de forma Strongly Typed em tempo de compilação. Como é suportada em tempo de compilação, suporta a utilização de intellisense como se tivéssemos indicado o tipo de dados de forma explícita.

Para garantir que a variável é convertida de forma correcta, é necessário que a atribuição seja feita na mesma linha que a declaração e a componente de atribuição tem que ser uma expressão. Deste modo não pode ser um objecto, nem uma collection, nem pode ser nula.

O Type Inference só pode ser usado em variáveis locais. Não pode ser usado nem propriedades ou campos e nem pode ser retornado por métodos.

Anonymous Types

Anonymous Types são classes sem nome que podem ser criadas dinamicamente no C# 3.0. Desta forma consegue-se criar novos tipos de dados em C#. Essas classes são criadas pelo compilador baseando-se na inicialização do objecto que está a ser instanciado.

Em vez de se declarar o tipo de dados de forma tradicional, define-se o tipo inline como parte do código onde está a ser utilizado.

Declaração tradicional

Morada morada = new Morada
{
  Rua = "Alameda das Flores 130",
  Localidade = "Pico"
}

Declaração usando Anonymous Types

var morada = new {
  Rua = "Alameda das Flores 130",
  Localidade = "Pico"	
}

Uma vez declarado o Anonymous Type, podemos usar a variável declarada como um objecto perfeitamente normal.

Note-se que, ao ser usada a inferência de dados com o var, tem-se acesso, dentro do método onde foi declarado, a um ambiente strongly typed, pois o compilador conhece todos os detalhes do Anonymous Type. No entanto não se pode retornar o Anonymous Type para fora do âmbito do método onde foi declarado. Como não existe um nome público para o tipo este não pode ser referenciado do exterior. A única alternativa de retornar um Anonymous Type é retorná-lo como Object.

Lambda Expressions

Expressões lambda são expressões que fornecem uma sintaxe curta para especificar algoritmos como argumentos para métodos.

As expressões lambda já são usadas a bastante tempo em várias linguagens de programação entre as quais podemos destacar o Lisp.

O modelo conceptual das expressões lambda foi criado em 1936 pelo matemático Alonzo Church.

No C# uma expressão lambda é indicada como:

[Lista de parâmetros separados por virgulas] + [operador =>] + [Expressão ou bloco de instruções]
 
(Param1, Param2, ..., ParamN] => expressão

Exemplo de criação de um filtro usando expressões lambda:

Func<string, bool> filter = x => x.Length > 4;

Publicado na edição 16 (PDF) da Revista PROGRAMAR.