DEV011
C# 3.0 Futuras Direcções e
Inovações na Linguagem
Luis Falcão
[email protected]
Professor,Instituto Superior de Engenharia de Lisboa(ISEL)
Patrocinadores
Agenda
O projecto Linq
Extensões ao C# 3.0 para suporte ao Linq
O Projecto LINQ
Objectos <book> <title/> <author/> <year/> <price/> </book> XML.NET Language Integrated Query
C# 3.0 VB 9.0 Others… Relacional LINQ to Objects LINQ to SQL LINQ to XML LINQ to Entities LINQ to DataSets
Linq para objectos
Luis Falcão
Professor
A Reter da Demo
Evolução da linguagem C#
C# 1.0
C# 2.0
C# 3.0
Managed Code
Generics
Language Integrated Query
C# 3.0 e Linq
Fundações
– C# 2.0
Genéricos
public class Stack<T>: IEnumerable<T> { T[] items;
int count;
public void Push(T data) {...} public T Pop() {...}
public IEnumerator<T> GetEnumerator() { for (int i = count – 1; i >= 0; --i) {
yield return items[i]; }
} int? x = 123; int? y = null; if (x == null) { . . . }
class Stack<T> { . . . }
Stack<int> stack = new Stack<int>();
Iteradores
Tipos Nullable
Agenda
O projecto Linq
Extensões ao C# 3.0 para suporte ao Linq
Inferência do tipo de variáveis locais
Métodos de extensão
Standard Query Operators
C# 3.0 – Objectivos de
desenho
Integração de objectos, dados relacionais
XML e outros
Aumentar a concisão da linguagem
Adicionar construções funcionais
Não ficar comprometido com APIs
específicas
Inovações no C# 3.0
var contacts =
from c in customers
where c.City == “Lisboa"
select new { c.Name, c.City };
var contacts =
customers
.Where(c => c.City == “Lisboa")
.Select(c => new { c.Name, c.City });
Métodos de extensão Expressões Lambda Expressões de query Iniciadores de Objectos Tipos anónimos Inferência do tipo das variáveis locais Expression trees Propriedades automáticas Partial methods
Agenda
O projecto Linq
Extensões ao C# 3.0 para suporte ao Linq
Inferência do tipo de variáveis locais
Métodos de extensão
Expressões Lambda
Iniciadores de Objectos e de Colecções
Tipos Anónimos
Expression Trees
Propriedades Automáticas
Expressões de Query
Standard Query Operators
Inferência do tipo de
variáveis locais
int i = 5; string s = "Hello"; double d = 1.0;
int[] numbers = new int[] {1, 2, 3};
Dictionary<int,Order> orders = new Dictionary<int,Order>();
var i = 5; var s = "Hello"; var d = 1.0;
var numbers = new int[] {1, 2, 3}; var orders = new Dictionary<int,Order>();
“var” significa que a variável assume o tipo da
expressão que a iniciou
Agenda
O projecto Linq
Extensões ao C# 3.0 para suporte ao Linq
Inferência do tipo de variáveis locais
Métodos de extensão
Expressões Lambda
Iniciadores de Objectos e de Colecções
Tipos Anónimos
Métodos de extensão
namespace MyStuff {
public static class Extensions {
public static string Concatenate(this IEnumerable<string> strings,
string separator) {…} }
}
using MyStuff;
string[] names = new string[] { “Sport", “Lisboa", “Benfica" }; string s = names.Concatenate(", ");
Extension method
Trazer extensões
para scope obj.Foo(x, y)
XXX.Foo(obj, x, y)
IntelliSense!
Agenda
O projecto Linq
Extensões ao C# 3.0 para suporte ao Linq
Inferência do tipo de variáveis locais
Métodos de extensão
Expressões Lambda
Iniciadores de Objectos e de Colecções
Tipos Anónimos
Expression Trees
Propriedades Automáticas
Expressões de Query
Standard Query Operators
public delegate bool Predicate<T>(T obj);
public class List<T> {
public List<T> FindAll(Predicate<T> test) { List<T> result = new List<T>(); foreach (T item in this)
if (test(item)) result.Add(item); return result;
}
Expressões Lambda
List<Customer> customers = GetCustomerList(); List<Customer> x = customers.FindAll(
delegate(Customer c) { return c.City == "Lisboa"; } );
List<Customer> x = customers.FindAll(c => c.City == "Lisboa");
Tipo explícito Statement context Tipo implícito Expression context
Expressões Lambda
public delegate T Func<T>(); public delegate T Func<A0, T>(A0 arg0); public delegate T Func<A0, A1, T>(A0 arg0, A1 arg1); …
Func<Customer, bool> test = c => c.City == "Lisboa";
Func<int, int, int> f = (x, y) => x * y;
Func<int, int, int> comparer = (int x, int y) => { if (x > y) return 1; if (x < y) return -1; return 0; }; double factor = 2.0;
Expressões Lambda e
Métodos de Extensão
Luis Falcão
Professor
Agenda
O projecto Linq
Extensões ao C# 3.0 para suporte ao Linq
Inferência do tipo de variáveis locais
Métodos de extensão
Expressões Lambda
Iniciadores de Objectos e de Colecções
Tipos Anónimos
Expression Trees
Propriedades Automáticas
Expressões de Query
Standard Query Operators
Iniciadores de Objectos
public class Point {
private int x, y;
public int X { get { return x; } set { x = value; } }
public int Y { get { return y; } set { y = value; } }
}
Point a = new Point { X = 0, Y = 1 };
Point a = new Point(); a.X = 0; a.Y = 1; Afectação de campos ou propriedades
Iniciadores de Objectos
public class Rectangle {
private Point p1 = new Point(); private Point p2 = new Point();
public Point P1 { get { return p1; } } public Point P2 { get { return p2; } } }
Rectangle r = new Rectangle { P1 = { X = 0, Y = 1 }, P2 = { X = 2, Y = 3 } };
Iniciadores de colecções
List<int> numbers = new List<int> { 1, 10, 100 };
Tem que implementar IEnumerable
List<int> numbers = new List<int>(); numbers.Add(1);
numbers.Add(10); numbers.Add(100);
Tem que ter um método público
Add()
Dictionary<int, string> spellings = new Dictionary<int, string> { { 0, "Zero" }, { 1, "One" }, { 2, "Two" }, { 3, "Three" } };
O método Add() pode ter mais q um parâmetro
Iniciadores de colecções
public class Contact {
private string name;
private List<string> phoneNumbers = new List<string>();
public string Name { get { return name; } set { name = value; } } public List<string> PhoneNumbers { get { return phoneNumbers;
} } }
List<Contact> contacts = new List<Contact> { new Contact {
Name = "Chris Smith",
PhoneNumbers = { "206-555-0101", "425-882-8080" } },
new Contact { Name = "Bob Harris",
PhoneNumbers = { "650-555-0199" } }
};
Agenda
O projecto Linq
Extensões ao C# 3.0 para suporte ao Linq
Inferência do tipo de variáveis locais
Métodos de extensão
Expressões Lambda
Iniciadores de Objectos e de Colecções
Tipos Anónimos
Expression Trees
Propriedades Automáticas
Expressões de Query
Standard Query Operators
Tipos Anónimos
public class Customer {
public string Name; public Address Address; public string Phone; public List<Order> Orders; …
}
public class Contact {
public string Nm; public string Tel; }
Customer c = GetCustomer(…);
Contact x = new Contact { Nm = c.Name, Tel = c.Phone };
Customer c = GetCustomer(…); var x = new { c.Name, c.Phone };
Customer c = GetCustomer(…); var x =new { Nm = c.Name, Tel = c.Phone };
class ??? {
public string Nm; public string Tel; }
var contacts = from c in customers where c.City == "Lisboa" select new { c.Name, c.Phone };
Tipos Anónimos
var contacts = customers.
.Where(c => c.City == "Lisboa") .Select(c => new { c.Name, c.Phone });
class ??? {
public string Name; public string Phone; }
IEnumerable<???>
foreach (var c in contacts) { Console.WriteLine(c.Name); Console.WriteLine(c.Phone); } ???
Agenda
O projecto Linq
Extensões ao C# 3.0 para suporte ao Linq
Inferência do tipo de variáveis locais
Métodos de extensão
Expressões Lambda
Iniciadores de Objectos e de Colecções
Tipos Anónimos
Expression Trees
Propriedades Automáticas
Expressões de Query
Standard Query Operators
Expression Trees
Code as data
Predicate<Customer> test = c => c.State == "WA";
Predicate<Customer> test = new Predicate<Customer>(XXX); private static bool XXX(Customer c) {
return c.State == "WA"; }
public delegate bool Predicate<T>(T item);
Expression Trees
Code as data
Expression<Predicate<Customer>> test = c => c.City == “Lisboa"; public delegate bool Predicate<T>(T item);
Agenda
O projecto Linq
Extensões ao C# 3.0 para suporte ao Linq
Inferência do tipo de variáveis locais
Métodos de extensão
Expressões Lambda
Iniciadores de Objectos e de Colecções
Tipos Anónimos
Expression Trees
Propriedades Automáticas
Expressões de Query
Standard Query Operators
Propriedades Automáticas
public class Product {
public string Name; public decimal Price; }
public class Product {
string name; decimal price; public string Name {
get { return name; } set { name = value; } }
public decimal Price { get { return price; } set { price = value; } }
}
public class Product {
public string Name { get; set; } public decimal Price { get; set; } }
private string □; public string Name {
get { return □; } set { □ = value; } }
Tem que terget e set
Agenda
O projecto Linq
Extensões ao C# 3.0 para suporte ao Linq
Inferência do tipo de variáveis locais
Métodos de extensão
Expressões Lambda
Iniciadores de Objectos e de Colecções
Tipos Anónimos
Expression Trees
Propriedades Automáticas
Expressões de Query
Standard Query Operators
Expressões de Query
Sintaxe de queries integrada na
linguagem
from
id in source
{
from
id
in
source |
where
condition }
[
orderby
ordering, ordering,
… ]
select
expr |
group
expr
by
key
[
into
id query ]
Começa com
from c in customers
where c.City == "Lisboa"
select new { c.Name, c.Phone };
customers
.Where(c => c.City == "Lisboa")
.Select(c => new { c.Name, c.Phone });
Expressões de Query
Exemplo
Os queries são transformados em execuções a
métodos
Where, Select, SelectMany, OrderBy, GroupBy
Inovações no C# 3.0
Resumo
Inferência do tipo de variáveis
Métodos de Extensão
Expressões Lambda
Iniciadores de Objectos &
Colecções
Tipos anónimos
Expression trees
Prop. automáticas
Expressões de query
var x = 5;static void Dump(this object o);
c => c.Name new Point { x = 1, y = 2 } new List<int> { 1, 10, 100 };
new { c.Name, c.Phone }
from … where … select Expression<T>
class Product
{ public string Name { get; set; } }
Inovações no C# 3.0
var contacts =
from c in customers
where c.City == “Lisboa"
select new { c.Name, c.City };
var contacts =
customers
.Where(c => c.City == “Lisboa")
.Select(c => new { c.Name, c.City });
Métodos de extensão Expressões Lambda Expressões de query Iniciadores de Objectos Tipos anónimos Inferência do tipo das variáveis locais Expression trees Propriedades automáticas Partial methods
Agenda
O projecto Linq
Extensões ao C# 3.0 para suporte ao Linq
Inferência do tipo de variáveis locais
Métodos de extensão
Expressões Lambda
Iniciadores de Objectos e de Colecções
Tipos Anónimos
Expression Trees
O Projecto LINQ
Objectos <book> <title/> <author/> <year/> <price/> </book> XML.NET Language Integrated Query
C# 3.0 VB 9.0 Others… Relacional LINQ to SQL LINQ to XML LINQ to Entities LINQ to DataSets LINQ to Objects
Standard Query Operators
Restriction Where Projection Select, SelectMany Ordering OrderBy, ThenBy Grouping GroupBy Quantifiers Any, All
Partitioning Take, Skip, TakeWhile, SkipWhile Sets Distinct, Union, Intersect, Except Elements First, FirstOrDefault, ElementAt Aggregation Count, Sum, Min, Max, Average Conversion ToArray, ToList, ToDictionary Casting OfType<T>
Standard Query
Operaqtors
Luis Falcão
Professor
Projecto Linq - Resumo
Language Integrated Query for .NET
Sintaxe nativa para queries em C# 3.0 and VB 9.0
Linq para objectos - Standard Query Operators
Queries SQL-like para qualquer colecção .NET
IEnumerable<T>
Linq to SQL
Framework Linq para acesso a dados relacionais
Linq to XML
Framework Linq para acesso a dados XML
Linq to DataSets
Onde nos leva o Linq?
Framework unificada de queries para
objectos, dados relacionais e XML
Compile type checking e IntelliSense nos
queries
Queries em C# e VB com expressividade
e “poder semelhante” ao SQL e XPath
Modelo extensível para linguagens / APIs
Recursos Úteis
Projecto Linq Website
http://msdn2.microsoft.com/en-us/netframework/aa904594.aspxC#3.0 – Future Versions
http://msdn2.microsoft.com/en-us/vcsharp/aa336745.aspxMicrosoft Visual Studio Code Name “Orcas”
Language-Integrated Query, May 2006
http://www.microsoft.com/downloads/details.aspx?familyid=1e902c21-340c-4d13-9f04-70eb5e3dceea&displaylang=en
Contactos Pessoais
Email: [email protected] Blog: http://www.cc.isel.ipl.pt/CS/blogs/lfalcao/default.aspxCCISEL
Site:http://www.cc.isel.ipl.pt/Formações .NET:
http://www.microsoft.com/downloads/details.aspx?familyid=1e902c21-340c-4d13-9f04-70eb5e3dceea&displaylang=enParticipe Noutras Sessões
DEV027 : LINQ - .NET Language
Integrated Query (LINQ) Framework
Quinta, 22 Fev, 13:30, Sala: A8
DEV015 : Introdução ao Windows
Communication Foundation [António Cruz]
Quinta, 22 Fev, 15:15, Sala: A6
DEV025 - Segurança na Windows
Communication Foundation [Pedro Félix]
Quinta, 22 Fev, 17:00, Sala: A2
ATE/Pergunte aos
Especialistas
Obtenha Respostas às Suas Questões
Outros Recursos
Para Profissionais de TI
TechNet Plus
2 incidentes de suporte gratuito profissional software exclusivo: Capacity Planner software Microsoft para avaliação actualizações de segurança e service packs acesso privilegiado à knowledge base formação gratuita e muito mais.
www.microsoft.com/portugal/technet/subscricoes
Questionário de Avaliação
Passatempo!
Complete o questionário de
avaliação e devolva-o no balcão
da recepção.
Habilite-se a ganhar uma Xbox
360 por dia!
DEV011
C# 3.0 Futuras Direcções e Inovações na Linguagem
© 2007 Microsoft Corporation. All rights reserved.