Características funcionais de C# 3.0
Seminário Programação Funcional
Equipe Felipe Cavalcanti – fcf3 Fernando Kakimoto – fvk Filipe César – fcsa Francisco Magalhães – fpms
Motivação Construção de APIs de mesmo poder
expressivo das linguagens de consulta – LINQ Project Bancos de dados relacionais XML
Coesão Redução de linhas de código
Uso de expressões lambda Maior entendimento do código (Readability)
Motivação Uso de extensão de métodos
Trabalhar com coleções de uma variedade de tipos
Uso de Generics
Composability Escrever código livre de efeitos colaterais
Roteiro Breve Histórico de C# Características funcionais de C# 3.0 Exemplos Conclusão
Breve Histórico de C# Criada pela Microsoft como parte da
iniciativa .NET Anunciada em Julho de 2000 após aprovação
ECMA-334 Características iniciais
Linguagem orientada a objetos Tipagem forte Portabilidade de código Gerenciador de memória automático Suporte a internacionalização
Breve Histórico de C# C# 2.0
Divulgada juntamente com o release do Visual Studio 2005
Introduziu extensões à linguagem Generics Anonymous method Iterators Partial types
Breve Histórico de C# C# 3.0
Corresponde à versão atual Lançada em 19 de Novembro de 2007 Parte do .NET Framework 3.5 Novas características
Linguagens funcionais LINQ
Características Funcionais de C# 3.0 Implicitly typed local variables Extension methods Tuples Object and collection initializers Anonymous types Query expressions Implicitly typed arrays Lambda expressions Expressions trees
Implicitly typed local variables Utilizando-se a palavra-chave var, força o
compilador a inferir o tipo da variável ou array de elementos da expressão do lado direito da sentença.
É obrigatório a inicialização da variável var na declaração
A inicialização precisa ter um tipo definido em tempo de compilação, aonde não pode ser null.
A inicialização não pode referenciar a declaração da variável.
Implicitly typed local variables A declaração da variável local com tipo
implícito é equivalente a declaração com tipo explicito mostrada a baixo:
Implicitly typed local variables Exemplos de declarações de variáveis locais
utilizando o var incorretamente:
Implicitly typed local variables Declaração de variável local:
var i = 5;
Inicialização do for: for(var x = 1; x < 10; x++)
Inicialização de um foreach foreach(var item in list){...}
Expressão using using (var file = new StreamReader("C:\\teste.txt"))
{...}
Extension methods Extension Methods nos permite adicionar
novos métodos em tipos já existentes sem que seja necessário realizar herança ou mesmo recompilar o tipo original
Métodos estáticos que podem ser chamados usando a síntaxe de métodos de instância.
O compilador fica responsável por procurar e invocar o método estendido
Extension methods Aplica-se para
Classes, classes abstratas e interfaces Tipos parametrizados e não-parametrizados
Passos Definir uma classe estática Definir um método estático cujo primeiro
argumento seja do tipo para o qual se deseja estender
Usar a palavra chave this no primeiro argumento
Extension methods Exemplo:
Extension methods É muito utilizado em query operators que
adicionam novas funcionalidades para tipos já existentes como IEnumerable.
Tuples Um dos tipos muito utilizados na programação
funcional. Listas de valores fortemente tipadas, tal
como o conjunto de argumentos para um método.
Tuples Exemplo:
Object and collection initializers Criam objetos e coleções em contextos de
expressões ao invés de declarações
Inicialização in-line de objetos
Mais conveniente de implementar
Mais fácil de ler
Object and collection initializers Exemplo
Declarativo Expressão
Object and collection initializers Passar como argumento de funções
Objetos dentro de objetos
Object and collection initializers Inicializador com construtores
Object and collection initializers Inicializadores de coleções
Consiste numa sequência de inicializadores, limitados por chaves e separados por vírgulas
Até agora Implicitly typed local variables
Realiza inferência do tipo de variável Extension methods
Estender tipos através de classes estáticas Tuples
Listas de valores fortemente tipadas Object and collection initializers
Inicialização in-line de objetos e coleções
Mais pra frente Anonymous types Query expressions Implicitly typed arrays Lambda expressions Expressions trees
Anonymous types Define, declara e instancia um tipo e um
objeto em um único passo (classe sem nome)
Utiliza a idéia de tuplas – conjunto de pares nome/valor
Limitado ao scopo local
Exemplo
Anonymous types Utilizado em projeções
Criar um subconjunto de valores
Query expressions Provê uma sintaxe integrada para consultas
semelhante à linguagens relacionais e hierárquicas como SQL e XQuery.
Iniciam com a cláusula from e terminam com a cláusula select ou group.
A cláusula from inicial pode ter em seguida zero ou mais from, let, where ou join.
Query expressions Cada let computa um valor e o coloca em um
identificador.
Cada where é um filtro que exclui itens do resultado
Joins comparam as chaves especificadas das duas sequências, retornando os valores iguais.
Query expressions Orderby ordena o resultado de acordo com o
critério desejado
O último select ou group especificam o formato do resultado.
Cláusula Into permite a junção de consultas tratando o resultado de uma consulta como um gerador de uma subsequente.
Query expressions Ambiguidades evitadas com expressões sendo
identificadas por from e qualquer token válido, exceto ";", "=" or ",".
Para utilizar qualquer uma das palavras-chaves, deve colocar o @ na frente.
Query expressions Exemplo
Query expressions Exemplo
Implicitly typed arrays Declarar arrays de tipos implícitos
O tipo é inferido de acordo com seus elementos
Todos os elementos devem ter um único tipo inferido Caso contrário, erro de complilação
Exemplo
Implicitly typed arrays Pode ser combinados com inicializadores de
objetos anônimos Cria uma estrutura de dado de tipo anônimo
Lambda expressions Expressam a implementação de um método
ou a instanciação de um delegate a partir de uma construção sintática simples
Usada em delegações e em árvores de expressões
Exemplo
Lambda expressions Statement lambda expressions
Expressões mais complicadas Uso de chaves
Expression trees Permitem que expressões lamda sejam
representadas como estruturas de dados ao invés de código executável.
Eficientes em termos de memória
Explicita e deixam transparentes a estrutura das expressões lambda
Expression trees Exemplo
Implicitly typed arrays Declarar arrays de tipos implícitos
O tipo é inferido de acordo com seus elementos
Todos os elementos devem ter um único tipo inferido Caso contrário, erro de complilação
Exemplo
Implicitly typed arrays Pode ser combinados com inicializadores de
objetos anônimos Cria uma estrutura de dado de tipo anônimo
Lambda expressions Expressam a implementação de um método
ou a instanciação de um delegate a partir de uma construção sintática simples
Usada em delegações e em árvores de expressões
Exemplo
Lambda expressions Statement lambda expressions
Expressões mais complicadas Uso de chaves
Expression trees Permitem que expressões lambda sejam
representadas como estruturas de dados ao invés de código executável.
Eficientes em termos de memória
Explicita e deixam transparentes a estrutura das expressões lambda
Expression trees Exemplo
Expression trees Exemplo[1]
Conclusão C# 3.0 e LINQ adotam muitos termos e
mecanismos das linguagens de programação funcional
Alto poder de coesão através das características apresentadas Diminui linhas de código Facilita a leitura Ajuda na manutenção e extensão
Apesar das várias características funcionais, C# é limitada, não se tornando verdadeiramente multiparadigma
Referências [1] “C# programming guide”, disponível em:
http://msdn.microsoft.com/en-us/library/67ef8sbd.aspx [2] Andrew Kennedy, “C# is a functional programming
language”, Microsoft Research Cambridge [3] “Is C# becoming a functional language?”,
disponível em: http://blogs.msdn.com/madst/archive/2007/01/23/is-c-becoming-a-functional-language.aspx
[4] Eric White, “Query Composition using Functional Programming Techniques in C# 3.0”, disponível em: http://blogs.msdn.com/ericwhite/pages/FP-Tutorial.aspx
[5] “Recommended blog for C# 3.0 and functional programming”, disponível em: http://blog.falafel.com/2007/09/04/RecommendedBlogForC30AndFunctionalProgramming.aspx
Características funcionais de C# 3.0
Seminário Programação Funcional