A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

8º Simpósio Brasileiro de Linguagens de Programação C# e Programação Genérica Joel Pereira Software Design Engineer WinFS API Team.

Apresentações semelhantes


Apresentação em tema: "8º Simpósio Brasileiro de Linguagens de Programação C# e Programação Genérica Joel Pereira Software Design Engineer WinFS API Team."— Transcrição da apresentação:

1 8º Simpósio Brasileiro de Linguagens de Programação C# e Programação Genérica Joel Pereira Software Design Engineer WinFS API Team Microsoft Corporation

2 Conteúdo Baseado na versão Visual Studio 2005, Community Release – Maio de 2004 Material disponibilizado pelo time C# Anders Hejlsberg Eric Gunnerson

3 Novidades da Linguagem C# Programação Genérica Tipos Nullable Métodos Anonimos Iterators Tipos Parciais Classe Estática Entre outras…

4 public class List { private object[] elements; private object[] elements; private int count; private int count; public void Add(object element) { public void Add(object element) { if (count == elements.Length) Resize(count * 2); if (count == elements.Length) Resize(count * 2); elements[count++] = element; elements[count++] = element; } public object this[int index] { public object this[int index] { get { return elements[index]; } get { return elements[index]; } set { elements[index] = value; } set { elements[index] = value; } } public int Count { public int Count { get { return count; } get { return count; } }} Programação Genérica public class List public class List { private T[] elements; private T[] elements; private int count; private int count; public void Add(T element) { public void Add(T element) { if (count == elements.Length) Resize(count * 2); if (count == elements.Length) Resize(count * 2); elements[count++] = element; elements[count++] = element; } public T this[int index] { public T this[int index] { get { return elements[index]; } get { return elements[index]; } set { elements[index] = value; } set { elements[index] = value; } } public int Count { public int Count { get { return count; } get { return count; } }} List intList = new List(); intList.Add(1);intList.Add(2);intList.Add("Three"); int i = (int)intList[0]; List intList = new List(); intList.Add(1);// Argument is boxed intList.Add(2);// Argument is boxed intList.Add("Three");// Should be an error int i = (int)intList[0];// Cast required List intList = new List (); intList.Add(1);// No boxing intList.Add(2);// No boxing intList.Add("Three");// Compile-time error int i = intList[0];// No cast required

5 Programação Genérica Porque? Verificação de tipos em tempo de compilação Desempenho Redução de código Como é implementado? Instanciado em tempo de execução, não compilação Verificação na declaração, não na instanciação Funciona para tipos referências e valores Informação em tempo de execução

6 Programação Genérica Parametros tipo podem ser especificados para Class, struct, interface, e delegate class Dictionary {…} struct HashBucket {…} interface IComparer {…} delegate R Function (A arg); Dictionary customerLookupTable; Dictionary > orderLookupTable; Dictionary wordCount;

7 Programação Genérica Parametros tipo podem ser especificados para Class, struct, interface, e delegate Métodos class Utils { public static T[] CreateArray (int size) { public static T[] CreateArray (int size) { return new T[size]; return new T[size]; } public static void SortArray (T[] array) { public static void SortArray (T[] array) { … }} string[] names = Utils.CreateArray (10); names[0] = "Jones"; …Utils.SortArray(names);

8 Programação Genérica Parametros tipo podem ser especificados para Class, struct, interface, e delegate Métodos Parametros tipo podem ter constraints class Dictionary class Dictionary { public void Add(K key, V value) { public void Add(K key, V value) { … if (((IComparable)key).CompareTo(x) == 0) {…} if (((IComparable)key).CompareTo(x) == 0) {…} … }} class Dictionary where K: IComparable { public void Add(K key, V value) { public void Add(K key, V value) { … if (key.CompareTo(x) == 0) {…} if (key.CompareTo(x) == 0) {…} … }} class Dictionary : IDictionary class Dictionary : IDictionary where K: IComparable where K: IComparable where V: IKeyProvider, IPersistable, new() where V: IKeyProvider, IPersistable, new() { public void Add(K key, V value) { … }}

9 Programação Genérica Constraint Primaria "class", or "struct" Constraint Secondaria Interface ou parametro tipo Constraint de instanciação "new()" class Link where T: class {…} class Nullable where T: struct {…} class Relation where T: class where U: T {…}

10 Programação Genérica Collection classes Collection interfaces Collection base classes Utility classes Reflection ListDictionarySortedDictionaryStackQueue IListIDictionaryICollectionIEnumerableIEnumeratorIComparableIComparer CollectionKeyedCollectionReadOnlyCollection NullableEventHandlerComparer

11 Demo Programação Genérica

12 Tipo Nullable System.Nullable Possibilita que um tipo valor seja null É uma struct que associa um T e um bool public struct Nullable where T: struct { public Nullable(T value) {…} public Nullable(T value) {…} public T Value { get {…} } public T Value { get {…} } public bool HasValue { get {…} } public bool HasValue { get {…} } …} Nullable x = new Nullable (123); … if (x.HasValue) Console.WriteLine(x.Value);

13 Tipo Nullable Síntaxe T? Literal null Lifted conversions Lifted operators Operador ?? int? x = 123; double? y = 1.0; int? x = null; double? y = null; int i = 123; int? x = i; double? y = x; int? z = (int?)y; int j = (int)z; int? x = GetNullableInt(); int? y = GetNullableInt(); int? z = x + y; int? x = GetNullableInt(); int? y = GetNullableInt(); int z = (x + y) / (x – y) ?? 0;

14 Métodos Anonimos class MyForm : Form { ListBox listBox; ListBox listBox; TextBox textBox; TextBox textBox; Button addButton; Button addButton; public MyForm() { public MyForm() { listBox = new ListBox(...); listBox = new ListBox(...); textBox = new TextBox(...); textBox = new TextBox(...); addButton = new Button(...); addButton = new Button(...); addButton.Click += new EventHandler(AddClick); addButton.Click += new EventHandler(AddClick); } void AddClick(object sender, EventArgs e) { void AddClick(object sender, EventArgs e) { listBox.Items.Add(textBox.Text); listBox.Items.Add(textBox.Text); }} class MyForm : Form { ListBox listBox; ListBox listBox; TextBox textBox; TextBox textBox; Button addButton; Button addButton; public MyForm() { public MyForm() { listBox = new ListBox(...); listBox = new ListBox(...); textBox = new TextBox(...); textBox = new TextBox(...); addButton = new Button(...); addButton = new Button(...); addButton.Click += delegate { addButton.Click += delegate { listBox.Items.Add(textBox.Text); listBox.Items.Add(textBox.Text); }; }; }}

15 Métodos Anonimos Permite bloco de código ao inves do delegate Infêrencia automatica do tipo de delegate Bloco de código sem uso de parametros Ou com parametros Em ambos os casos, tipo de retorno deve ser igual button.Click += delegate { MessageBox.Show("Hello"); }; button.Click += delegate(object sender, EventArgs e) { MessageBox.Show(((Button)sender).Text); };

16 Métodos Anonimos Bloco de código pode acessar variáveis locais delegate bool Predicate (T item); public class List public class List { public List FindAll(Predicate filter) { public List FindAll(Predicate filter) { List result = new List (); List result = new List (); foreach (T item in this) { foreach (T item in this) { if (filter(item)) result.Add(item); if (filter(item)) result.Add(item); } return result; return result; }} public class Bank { List accounts; List accounts; List GetOverdrawnAccounts() { List GetOverdrawnAccounts() { return accounts.FindAll(delegate(Account a) { return accounts.FindAll(delegate(Account a) { return a.Balance < 0; return a.Balance < 0; }); }); } List GetLargeAccounts(double minBalance) { List GetLargeAccounts(double minBalance) { return accounts.FindAll(delegate(Account a) { return accounts.FindAll(delegate(Account a) { return a.Balance >= minBalance; return a.Balance >= minBalance; }); }); }} public class Bank { List GetLargeAccounts(double minBalance) { List GetLargeAccounts(double minBalance) { Helper helper = new Helper(); Helper helper = new Helper(); helper.minBalance = minBalance; helper.minBalance = minBalance; return accounts.FindAll(helper.Matches); return accounts.FindAll(helper.Matches); } internal class Helper internal class Helper { internal double minBalance; internal double minBalance; internal bool Matches(Account a) { internal bool Matches(Account a) { return a.Balance >= minBalance; return a.Balance >= minBalance; } } } } }

17 Métodos Anonimos Converção de métodos Tipo inferido quando possivel using System; using System.Threading; class Program { static void Work() {…} static void Work() {…} static void Main() { static void Main() { Thread t = new Thread(new ThreadStart(Work)); Thread t = new Thread(new ThreadStart(Work)); t.Start(); t.Start(); }} using System; using System.Threading; class Program { static void Work() {…} static void Work() {…} static void Main() { static void Main() { Thread t = new Thread(Work); Thread t = new Thread(Work); t.Start(); t.Start(); }}

18 Iterators foreach depende enumerator pattern Método GetEnumerator() foreach faz uma enumeração ficar fácil Mas enumeradores são dificeis de escrever! foreach (object obj in list) { DoSomething(obj); DoSomething(obj);} Enumerator e = list.GetEnumerator(); while (e.MoveNext()) { object obj = e.Current; object obj = e.Current; DoSomething(obj); DoSomething(obj);}

19 Iterators public class List { internal object[] elements; internal object[] elements; internal int count; internal int count; public ListEnumerator GetEnumerator() { return new ListEnumerator(this); public ListEnumerator GetEnumerator() { return new ListEnumerator(this); }} public class ListEnumerator : IEnumerator { List list; List list; int index; int index; internal ListEnumerator(List list) { internal ListEnumerator(List list) { this.list = list; this.list = list; index = -1; index = -1; } public bool MoveNext() { public bool MoveNext() { int i = index + 1; int i = index + 1; if (i >= list.count) return false; if (i >= list.count) return false; index = i; index = i; return true; return true; } public object Current { public object Current { get { return list.elements[index]; } get { return list.elements[index]; } }}

20 public class List { public IEnumerator GetEnumerator() { public IEnumerator GetEnumerator() { for (int i = 0; i < count; i++) { yield return elements[i]; for (int i = 0; i < count; i++) { yield return elements[i]; } }} Iterators Método que computa e retorna uma sequência de valores incrementalmente yield return e yield break Deve retornar um IEnumerator ou IEnumerable public IEnumerator GetEnumerator() { return new __Enumerator(this); return new __Enumerator(this);} private class __Enumerator: IEnumerator { object current; object current; int state; int state; public bool MoveNext() { public bool MoveNext() { switch (state) { switch (state) { case 0: … case 0: … case 1: … case 1: … case 2: … case 2: … … } } public object Current { public object Current { get { return current; } get { return current; } }}

21 public class List public class List { public IEnumerator GetEnumerator() { public IEnumerator GetEnumerator() { for (int i = 0; i < count; i++) yield return elements[i]; for (int i = 0; i < count; i++) yield return elements[i]; } public IEnumerable Descending() { public IEnumerable Descending() { for (int i = count - 1; i >= 0; i--) yield return elements[i]; for (int i = count - 1; i >= 0; i--) yield return elements[i]; } public IEnumerable Subrange(int index, int n) { public IEnumerable Subrange(int index, int n) { for (int i = 0; i < n; i++) yield return elements[index + i]; for (int i = 0; i < n; i++) yield return elements[index + i]; }} Iterators List items = GetItemList(); foreach (Item x in items) {…} foreach (Item x in items.Descending()) {…} foreach (Item x in Items.Subrange(10, 20)) {…}

22 Demo

23 Tipos Parciais public partial class Customer { private int id; private int id; private string name; private string name; private string address; private string address; private List orders; private List orders;} public partial class Customer { public void SubmitOrder(Order order) { public void SubmitOrder(Order order) { orders.Add(order); orders.Add(order); } public bool HasOutstandingOrders() { public bool HasOutstandingOrders() { return orders.Count > 0; return orders.Count > 0; }} public class Customer { private int id; private int id; private string name; private string name; private string address; private string address; private List orders; private List orders; public void SubmitOrder(Order order) { public void SubmitOrder(Order order) { orders.Add(order); orders.Add(order); } public bool HasOutstandingOrders() { public bool HasOutstandingOrders() { return orders.Count > 0; return orders.Count > 0; }}

24 Classes Estáticas Pode conter apenas membros estáticos Não pode ser tipo de variável, parâmetro, … System.Console, System.Environment, … public static class Math { public static double Sin(double x) {…} public static double Sin(double x) {…} public static double Cos(double x) {…} public static double Cos(double x) {…} …}

25 Acesso à Propriedades Diferentes níveis de acesso para Get/Set Típica configuração set {…} mais restrito que get {…} public class Customer { private string id; private string id; public string CustomerId { public string CustomerId { get { return id; } get { return id; } internal set { id = value; } internal set { id = value; } }}

26 Aliases Externos Assemblies com nomes de tipo idênticos Versões diferentes do mesmo assembly namespace Stuff { public class Utils public class Utils { public static void F() {…} public static void F() {…} }} namespace Stuff { public class Utils public class Utils { public static void F() {…} public static void F() {…} }} foo.dllbar.dll extern alias Foo; extern alias Bar; class Program { static void Main() { static void Main() { Foo.Stuff.Utils.F(); Foo.Stuff.Utils.F(); Bar.Stuff.Utils.F(); Bar.Stuff.Utils.F(); }} C:\>csc /r:Foo=foo.dll /r:Bar=bar.dll test.cs

27 Namespace Alias Qualifiers A::B procura por A como namespace alias global::X procura X no namespace global using IO = System.IO; class Program { static void Main() { static void Main() { IO::Stream s = new IO::File.OpenRead("foo.txt"); IO::Stream s = new IO::File.OpenRead("foo.txt"); global::System.Console.WriteLine("Hello"); global::System.Console.WriteLine("Hello"); }}

28 Controle de Warning #pragma warning using System; class Program { [Obsolete] [Obsolete] static void Foo() {} static void Foo() {} static void Main() { static void Main() { #pragma warning disable 612 Foo(); Foo(); #pragma warning restore 612 }}

29 Threading Semaphore Resource counting for mutexs // construct a semaphore with a count of 3 Semaphore sem = new Semaphore(3); private void UseResource { // Wait until a count is available… sem.WaitOne(); // the sem count is reduced by one // other code … // Release the count: sem.Release(); // the count is incremented by one

30 Threading Named Events V1.0 and V1.1: Events can only signal the same process Whidbey: Named Events allow cross process communication V1.0 and V1.1: Events can only signal the same process Whidbey: Named Events allow cross process communication Public Class EventWaitHandle Inherits WaitHandle Public Sub New EventWaitHandle(initialState As Boolean, type As EventType, name As String )

31 Longhorn and WinFX: Re-Invigorating the Virtuous Cycle Applies.NET Framework goodness to core OS Consistent, object oriented Secure, reliable platform Modern library and language designs Enables new class of applications all built on managed code Fuels ecosystems for the next decade of growth

32 For More Information Applied Microsoft.NET Framework Programming (Richter) NET Framework Standard Library Annotated Reference, Vol. 1 (Abrams)

33 Outras novidades Friend assemblies Delegate co- and contra-variance Overloading on type parameter count

34 Q & A

35 © 2004 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.


Carregar ppt "8º Simpósio Brasileiro de Linguagens de Programação C# e Programação Genérica Joel Pereira Software Design Engineer WinFS API Team."

Apresentações semelhantes


Anúncios Google