a linguagem c#

36
A linguagem C# A linguagem C# Paulo Marques Paulo Marques Departamento de Eng. Informática Departamento de Eng. Informática Universidade de Coimbra Universidade de Coimbra ([email protected]) ([email protected])

Upload: sasha

Post on 14-Jan-2016

31 views

Category:

Documents


0 download

DESCRIPTION

A linguagem C#. Paulo Marques Departamento de Eng. Informática Universidade de Coimbra ([email protected]). Background. Investigador em Sistemas Distribuídos (Dep. Eng. Informática -- U. Coimbra) Experiência em Java e C++ Activamente a aprender C# e .NET - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: A linguagem C#

A linguagem C#A linguagem C#

Paulo MarquesPaulo MarquesDepartamento de Eng. Informática Departamento de Eng. Informática

Universidade de CoimbraUniversidade de Coimbra

([email protected])([email protected])

Page 2: A linguagem C#

BackgroundBackground

Investigador em Sistemas Distribuídos Investigador em Sistemas Distribuídos (Dep. Eng. Informática -- U. Coimbra)(Dep. Eng. Informática -- U. Coimbra)

Experiência em Java e C++Experiência em Java e C++ Activamente a aprender C# e .NETActivamente a aprender C# e .NET

Não sou um perito!!! Não sou um perito!!! (nem sequer trabalho para a Microsoft!)(nem sequer trabalho para a Microsoft!)

Tenho vindo a “experimentar” com o ambiente de Tenho vindo a “experimentar” com o ambiente de desenvolvimentodesenvolvimento

Ofereço a perspectiva de quem tem vindo a aprender Ofereço a perspectiva de quem tem vindo a aprender e a utilizar a linguageme a utilizar a linguagem

Page 3: A linguagem C#

Sobre o que iremos falar...Sobre o que iremos falar...

A linguagem C#A linguagem C# ApenasApenas as características mais interessantes as características mais interessantes

Alguma Alguma comparaçãocomparação c/ Java e C++ c/ Java e C++

Reflexão Reflexão crítica crítica (aspectos positivos e negativos)(aspectos positivos e negativos)

Page 4: A linguagem C#

““Hello World” Hello World” (ou... onde é que já vi isto antes?)(ou... onde é que já vi isto antes?)

using System;using System;

public class HelloWorld public class HelloWorld {{ public static void Main(string[] args) public static void Main(string[] args) {{ Console.WriteLine(“Hello World!”);Console.WriteLine(“Hello World!”); }}}}

Page 5: A linguagem C#

FamiliarFamiliar

Eu já sei Java/C++...Eu já sei Java/C++...

public class Pessoapublic class Pessoa{{ private string private string Nome;Nome; private int private int Idade;Idade;

public Pessoa(string nome, int idade) {public Pessoa(string nome, int idade) { this.Nome = nome;this.Nome = nome; this.Idade = idade;this.Idade = idade; }}

public void MostraInfo() {public void MostraInfo() { Console.WriteLine(“{0}, tem {1} anos”, Console.WriteLine(“{0}, tem {1} anos”, Nome, Idade);Nome, Idade); }}}}

Pessoa Cliente = new Pessoa(“Carlos”, 25);

Cliente.MostraInfo();

Page 6: A linguagem C#

C# - CaracterísticasC# - Características

Muito semelhante ao C++/JavaMuito semelhante ao C++/Java É fácil começar a programar em C#É fácil começar a programar em C#

Sistema unificado de tiposSistema unificado de tipos Tudo pode ser visto como um objectoTudo pode ser visto como um objecto

Suporte directo à Programação Baseada Suporte directo à Programação Baseada em Componentesem Componentes Propriedades, Eventos e AtributosPropriedades, Eventos e Atributos AssembliesAssemblies

Page 7: A linguagem C#

Tudo é um objecto!Tudo é um objecto!

int val = 10;int val = 10;

object obj = val;object obj = val;

int k = (int) obj;int k = (int) obj; // k fica c/ valor 10// k fica c/ valor 10

System.Int32System.Int32 }} ““Boxing”Boxing”

1010

1010

val

obj

}} ““Unboxing”Unboxing”

??

1010k

Page 8: A linguagem C#

Tudo é um objecto (2)Tudo é um objecto (2)

JAVAJAVA

Hashtable ht Hashtable ht

= new Hashtable();= new Hashtable();

ht.put(ht.put(new Integer(1)new Integer(1), “Xpto”);, “Xpto”);

ht.put(ht.put(new Integer(2)new Integer(2), “Xpti”);, “Xpti”);

C#C#

Hashtable ht Hashtable ht

= new Hashtable();= new Hashtable();

ht.Add(ht.Add(11, “Xpto”);, “Xpto”);

ht.Add(ht.Add(22, “Xpti”);, “Xpti”);

O fim das “wrapper classes”!O fim das “wrapper classes”!

Page 9: A linguagem C#

C# 101C# 101

Controlo de execuçãoControlo de execução if, for, if, for, foreachforeach, do, while, switch, ..., do, while, switch, ...

TiposTipos Valor: elementares, Valor: elementares, structstruct, , enumenum Referência: Referência: classclass,, interfaceinterface, , delegatedelegate, tabelas, tabelas PonteirosPonteiros

int[] tabela = {1, 2, 3};int[] tabela = {1, 2, 3};

foreach (int i in tabela)foreach (int i in tabela)

Console.WriteLine(“{0}”, i);Console.WriteLine(“{0}”, i);

Page 10: A linguagem C#

Sistema de TiposSistema de Tipos

ObjectObject

StringString

ArrayArray

ValueTypeValueType

EnumEnum

StructStruct

intint

shortshort

bytebyte

charchar

floatfloat

decimaldecimal

longlong

uintuint

ulongulong

sbytesbyte

ushortushort

boolbool

doubledouble

ClassClass

string Nome;

int[] tabela;

class Pessoa { ... }

decimal conta;

enum Estado { Ligado, Desligado}

struct Ponto { int x; int y; }

Page 11: A linguagem C#

C# 101 – Herança C# 101 – Herança public class Pessoapublic class Pessoa{{ private string private string Nome;Nome; private int private int Idade;Idade;

public Pessoa(string nome, int idade) {public Pessoa(string nome, int idade) { this.Nome = nome;this.Nome = nome; this.Idade = idade;this.Idade = idade; }}

public void MostraInfo() {public void MostraInfo() { Console.WriteLine(“{0}, tem {1} anos”, Console.WriteLine(“{0}, tem {1} anos”, Nome, Idade);Nome, Idade); }}}}

public class Pessoapublic class Pessoa{{ private string private string Nome;Nome; private int private int Idade;Idade;

public Pessoa(string nome, int idade) {public Pessoa(string nome, int idade) { this.Nome = nome;this.Nome = nome; this.Idade = idade;this.Idade = idade; }}

public public virtualvirtual void MostraInfo() { void MostraInfo() { Console.WriteLine(“{0}, tem {1} anos”, Console.WriteLine(“{0}, tem {1} anos”, Nome, Idade);Nome, Idade); }}}}

Por omissão, os métodos não são virtuais!Por omissão, os métodos não são virtuais!

public class Empregado public class Empregado : Pessoa: Pessoa{{ private string Empresa;private string Empresa;

public Empregado(string nome, int idade, intpublic Empregado(string nome, int idade, int empresa) empresa)

: base(nome, idade): base(nome, idade) {{ this.Empresa = empresa;this.Empresa = empresa; }}

public public overrideoverride void MostraInfo() { void MostraInfo() { base.MostraInfo();base.MostraInfo(); Console.WriteLine(“Empresa: {0}”, Empresa);Console.WriteLine(“Empresa: {0}”, Empresa); }}}}

Page 12: A linguagem C#

C# 101 – Static vs. Dinamic bindingC# 101 – Static vs. Dinamic bindingpublic class Base {public class Base { void Xpto() { Console.WriteLine(“Base.Xpto()”); }void Xpto() { Console.WriteLine(“Base.Xpto()”); } virtualvirtual void Xpti() { Console.WriteLine(“Base.Xpto()”); } void Xpti() { Console.WriteLine(“Base.Xpto()”); }}}

public class Derivada public class Derivada : Base: Base{{ new new void Xpto() { Console.WriteLine(“Deriv.Xpto()”); }void Xpto() { Console.WriteLine(“Deriv.Xpto()”); } overrideoverride void Xpti() { Console.WriteLine(“Deriv.Xpto()”); } void Xpti() { Console.WriteLine(“Deriv.Xpto()”); }}}

Derivada d = new Derivada();Derivada d = new Derivada();

d.Xpto();d.Xpto(); // Resulta em “Deriv.Xpto()”// Resulta em “Deriv.Xpto()”d.Xpti();d.Xpti(); // Resulta em “Deriv.Xpti()”// Resulta em “Deriv.Xpti()”

Base dref = d;Base dref = d;dref.Xpto();dref.Xpto(); // Resulta em “Base.Xpto()”// Resulta em “Base.Xpto()”dref.Xpti();dref.Xpti(); // resulta em “Deriv.Xpti()”// resulta em “Deriv.Xpti()”

Page 13: A linguagem C#

Porquê é que isto é importante?Porquê é que isto é importante?

public class Apublic class A{{ public void f() {public void f() { ...... }}}}

public class B public class B extends A extends A{{ private int recursos;private int recursos;

public void limpa() {public void limpa() { recursos = 0;recursos = 0; }}}}

B objB = new B();B objB = new B();objB.f();objB.f();

public class A public class A // Segunda versão// Segunda versão{{ private int total;private int total;

public void f() {public void f() { ...... limpa();limpa(); }}

public void limpa() {public void limpa() { total = 0;total = 0; }}}}

Deixa de funcionar!Deixa de funcionar!(recursos=0, em vez de total=0)(recursos=0, em vez de total=0)

Page 14: A linguagem C#

C# 101 – Diferentes versões C# 101 – Diferentes versões de classesde classes

Em C#, existe suporte para introdução de novas Em C#, existe suporte para introdução de novas versões de classes.versões de classes.

O programador tem sempre de indicar O programador tem sempre de indicar explicitamente a sua intenção (explicitamente a sua intenção (virtualvirtual, , newnew, , overrideoverride)!)!

O compilador gera O compilador gera warningswarnings quando são quando são detectadas novas versões. O programador tem detectadas novas versões. O programador tem de dizer explicitamente o que quer fazer.de dizer explicitamente o que quer fazer.

É uma boa ajuda, mas não resolve tudo...É uma boa ajuda, mas não resolve tudo...(mas... uma aplicação que continua a correr, (mas... uma aplicação que continua a correr, sem o sem o bugbug, é melhor do que uma aplicação a , é melhor do que uma aplicação a correr correr com o com o bugbug!)!)

Page 15: A linguagem C#

C# 101 – Gestão de versõesC# 101 – Gestão de versões

public class Apublic class A{{ public void f() {public void f() { ...... }}}}

public class B : Apublic class B : A{{ private int recursos;private int recursos;

public void limpa() {public void limpa() { recursos = 0;recursos = 0; }}}}

B objB = new B();B objB = new B();objB.f();objB.f();

public class A public class A // Segunda versão// Segunda versão{{ private int total;private int total;

public void f() {public void f() { ...... limpa();limpa(); }}

public void limpa() {public void limpa() { total = 0;total = 0; }}}}

Ao compilar é gerado um Ao compilar é gerado um warningwarning, mas funciona correctamente (linking , mas funciona correctamente (linking estático)estático)

public class B : Apublic class B : A{{ private int recursos;private int recursos;

public public newnew void limpa() { void limpa() { recursos = 0;recursos = 0; }}}}

O programador tem de dizer O programador tem de dizer explicitamenteexplicitamente o que quer fazer! o que quer fazer!

Page 16: A linguagem C#

DemoDemo Suporte a diferentes versões de classesSuporte a diferentes versões de classes

...que é como quem diz... “estou farto dos slides, mostrem-me o IDE!”

Page 17: A linguagem C#

C# 101 - InterfacesC# 101 - Interfaces

Muito semelhante ao JavaMuito semelhante ao Java

interface ILeitorCDinterface ILeitorCD{{ void TocaCD(CD cd);void TocaCD(CD cd);}}

public class Aparelhagem public class Aparelhagem : ILeitorCD: ILeitorCD{{ void TocaCD(CD cd) {void TocaCD(CD cd) { ...... }}}}

public class Computador public class Computador : ILeitorCD: ILeitorCD{{ void TocaCD(CD cd) {void TocaCD(CD cd) { ...... }}}}

Aparelhagem sony = new Aparelhagem();Aparelhagem sony = new Aparelhagem();Computador pc = new Computador();Computador pc = new Computador();ILeitorCD leitor;ILeitorCD leitor;

leitor = sony;leitor = sony;leitor.tocaCD(GreatestHits);leitor.tocaCD(GreatestHits);

leitor = pc;leitor = pc;pc.tocaCD(GreatestHits);pc.tocaCD(GreatestHits);

Page 18: A linguagem C#

C# 101 - ComponentesC# 101 - Componentes O C# suporta directamente programação baseada em O C# suporta directamente programação baseada em

componentescomponentes Conceito de Conceito de assemblyassembly na platforma .NET na platforma .NET

PropriedadesPropriedades• Permitem usar campos como se de variáveis se tratassemPermitem usar campos como se de variáveis se tratassem

Cliente.Nome = “Joao”; Cliente.Nome = “Joao”;

EventosEventos• Permitem notificar outros de acontecimentos num certo objecto Permitem notificar outros de acontecimentos num certo objecto

... OnMouseClick ... ... OnMouseClick ...

AtributosAtributos• Permitem realizar programação declarativa Permitem realizar programação declarativa

[IsThreadSafe] [IsThreadSafe] void xpto() { ... }void xpto() { ... }

Page 19: A linguagem C#

C# 101 - PropriedadesC# 101 - Propriedadespublic class Pessoapublic class Pessoa{{ private int IdadePessoa;private int IdadePessoa;

public public string Idadestring Idade { { get {get { return IdadePessoa;return IdadePessoa; }}

setset {{ if (if (valuevalue > 0) > 0) IdadePessoa = IdadePessoa = valuevalue;; elseelse error();error(); }} }}

......}}

Pessoa p = new Pessoa();Pessoa p = new Pessoa();

p.Idade = 25;p.Idade = 25;Console.WriteLine(“{0}”, p.Idade);Console.WriteLine(“{0}”, p.Idade);

p.Idade = -10; p.Idade = -10; // error() chamado// error() chamado

Page 20: A linguagem C#

C# 101 - EventosC# 101 - Eventos

Os eventos são baseados no conceito de Os eventos são baseados no conceito de “delegate”.“delegate”.

Os “delegate” funcionam como ponteiros Os “delegate” funcionam como ponteiros para funções, que são para funções, que são type safetype safe..

delegate void Funcao(int x);delegate void Funcao(int x);

class Xptoclass Xpto{{ public static void Mostra(int val) {public static void Mostra(int val) { Console.WriteLine(“{0}”, val);Console.WriteLine(“{0}”, val); }}}}

Funcao f;Funcao f;

f = new Funcao(Xpto.Mostra);f = new Funcao(Xpto.Mostra);f(10);f(10);

equivalente aproximado em C++ ... void (Funcao*)(int x);

Page 21: A linguagem C#

C# 101 – Eventos (2)C# 101 – Eventos (2)

EventPublisher

EventDelegate

EventSubscriber

EventHandler

EventSubscriber

EventHandler

EventSubscriber

EventHandler

Evento

Evento

Evento

Funcionam usando multicast delegatesFuncionam usando multicast delegates

Page 22: A linguagem C#

C# 101 – Multicast DelegatesC# 101 – Multicast Delegatesdelegate void Funcao(int x);delegate void Funcao(int x);

class A {class A { public static void Quadrado(int val) {public static void Quadrado(int val) { Console.WriteLine(“{0}”, val*val);Console.WriteLine(“{0}”, val*val); }}}}

class B {class B { public static void Raiz(int valor) {public static void Raiz(int valor) { Console.WriteLine(“{0}”, Math.Sqrt(val));Console.WriteLine(“{0}”, Math.Sqrt(val)); }}}}

Funcao f;Funcao f;f = new Funcao(Xpto.Quadrado);f = new Funcao(Xpto.Quadrado);f+= new Funcao(Xpto.Raiz)f+= new Funcao(Xpto.Raiz)

f(10);f(10); // Chama ambos os métodos!// Chama ambos os métodos!

Page 23: A linguagem C#

DemoDemo Multicast delegatesMulticast delegates Window and event handlingWindow and event handling

Page 24: A linguagem C#

C# 101 - AtributosC# 101 - Atributos

Os atributos marcam o código com informação Os atributos marcam o código com informação útil para o compilador útil para o compilador (e não só!)(e não só!) Muito úteis quando associados ao mecanismo de Muito úteis quando associados ao mecanismo de

introspecçãointrospecção Programação declarativa vs. imperativaProgramação declarativa vs. imperativa

class DataBaseclass DataBase

{{

[Conditional(“DEBUG”)][Conditional(“DEBUG”)]

public void dumpDatabaseDisk() { ... }public void dumpDatabaseDisk() { ... }

}}

Page 25: A linguagem C#

C# 101 – Atributos (2)C# 101 – Atributos (2)

class Crackerclass Cracker

{{

[DllImport(“crack_lib.dll”][DllImport(“crack_lib.dll”]

public static extern solver();public static extern solver();

[WebMethod][WebMethod]

public byte[] public byte[]

CrackPassword(byte[] passFile)CrackPassword(byte[] passFile)

{{

......

}}

}}

• Posso indicar as características do código, sendo essa informação usada pelo compilador ou outras rotinas

• Posso criar novos atributos para descrever declarativamente o código.

Page 26: A linguagem C#

Gestão de ErrosGestão de Erros

O C# suporta o conceito de excepçõesO C# suporta o conceito de excepções

public class Pessoapublic class Pessoa{{ ......

public public string Idadestring Idade { { ......

set {set { if (novaIdade > 0)if (novaIdade > 0) IdadePessoa IdadePessoa = value;= value; elseelse throw new IdadeInvalidaException(value);throw new IdadeInvalidaException(value); }} }}}}

Pessoa p = new Pessoa();Pessoa p = new Pessoa();

trytry{{ p.Idade = -10; p.Idade = -10; // Irá lançar uma excepção!// Irá lançar uma excepção! ...... // Este código não é executado// Este código não é executado}}catch (IdadeInvalidaException e)catch (IdadeInvalidaException e){{ Console.WriteLine(“Nao pode introduzir essa idade!”);Console.WriteLine(“Nao pode introduzir essa idade!”);}}

Page 27: A linguagem C#

Gestão de Erros (2)Gestão de Erros (2)

trytry//catchcatch//finallyfinally: permitem apanhar e : permitem apanhar e tratar as excepções no códigotratar as excepções no código

throwthrow: permite lançar uma excepção: permite lançar uma excepção

Infelizmente...Infelizmente... Em C# não é possível declarar as excepções Em C# não é possível declarar as excepções

que uma rotina pode lançar que uma rotina pode lançar Não é necessário apanhar as excepções que Não é necessário apanhar as excepções que

são lançadas pelas rotinas!são lançadas pelas rotinas!

Page 28: A linguagem C#

Problema c/ ExcepçõesProblema c/ Excepçõespublic class Loggerpublic class Logger{{ public static void log(string msg) {public static void log(string msg) { // Escreve em disco “msg”// Escreve em disco “msg” // Na documentação não consta nenhuma excepção// Na documentação não consta nenhuma excepção }}}}

public class BaseDadospublic class BaseDados{{ public void AbreLigacao() {public void AbreLigacao() { try {try { bd.EstablishConnection();bd.EstablishConnection(); // Funciona bem!// Funciona bem!

Logger.log(“Ok”);Logger.log(“Ok”); // Gera excepção// Gera excepção }} catch (Exception e) {catch (Exception e) { Logger.log(“Não foi possível abrir a ligação”); Logger.log(“Não foi possível abrir a ligação”); // !!!// !!! }}}}

Page 29: A linguagem C#

Redefinição de OperadoresRedefinição de Operadores

Em C# é possível redefinir os operadores Em C# é possível redefinir os operadores existentes.existentes.

Lista A = new Lista();Lista A = new Lista();Lista B = new Lista();Lista B = new Lista();

A.Add(1);A.Add(1);A.Add(2);A.Add(2);

B.Add(3);B.Add(3);B.Add(4);B.Add(4);

Lista C = A + B; Lista C = A + B; // Junta ambas as listas// Junta ambas as listas

Page 30: A linguagem C#

Redefinição de Operadores (2)Redefinição de Operadores (2)

public class Listapublic class Lista{{ private object[]private object[] Elementos;Elementos;

......

public static Lista operator+(Lista a, Lista b)public static Lista operator+(Lista a, Lista b) {{ Lista resultado = new Lista();Lista resultado = new Lista();

// Copia os elementos de <a> e <b> para // Copia os elementos de <a> e <b> para // a lista <resultado>// a lista <resultado>

return resultado;return resultado; }}}}

Lista A = new Lista();Lista A = new Lista();Lista B = new Lista();Lista B = new Lista();

......

Lista C = A + B;Lista C = A + B;

Page 31: A linguagem C#

Redefinição de Operadores (3)Redefinição de Operadores (3)

A redefinição de operadores deve de ser A redefinição de operadores deve de ser feita com cuidadofeita com cuidado Sem problemas em casos simplesSem problemas em casos simples Complicada quando se utilizam Complicada quando se utilizam featuresfeatures

avançadas (ex: avançadas (ex: user-defined casts, user-defined casts, implicit/explicitimplicit/explicit))

Page 32: A linguagem C#

UnsafeUnsafe Code Code

O C# suporta elementos avançados, como O C# suporta elementos avançados, como a utilização de ponteirosa utilização de ponteiros

Sempre que são utilizados estes Sempre que são utilizados estes elementos, o código tem de ser colocado elementos, o código tem de ser colocado dentro de um contexto “unsafe”dentro de um contexto “unsafe”

int total = 0;int total = 0;

unsafeunsafe{{ int* ptr = &total;int* ptr = &total;

*total = 10;*total = 10;}}

public public unsafe unsafe void FastCopy(byte* dst, byte* src,void FastCopy(byte* dst, byte* src, int count) int count){{ for (int i=0; i<count; i++)for (int i=0; i<count; i++) *dst++ = *src++;*dst++ = *src++;}}

Page 33: A linguagem C#

C# 101 – Documentação em XMLC# 101 – Documentação em XML

/// <summary>/// <summary>////// Este método calcula o ordenado de uma pessoa, Este método calcula o ordenado de uma pessoa, ////// baseado nos seus dias de trabalho. baseado nos seus dias de trabalho./// </summary>/// </summary>///////// <param name=“diasTrabalho">/// <param name=“diasTrabalho">////// O número de dias que trabalhou. O número de dias que trabalhou./// </param>/// </param>///////// <returns>/// <returns> O salário da pessoa. O salário da pessoa. </returns></returns>

public int CalculaOrdenado(int diasTrabalho)public int CalculaOrdenado(int diasTrabalho){{ ......}}

Page 34: A linguagem C#

Conclusão (1)Conclusão (1)

C# -- Pontos PositivosC# -- Pontos Positivos Orientada aos ComponentesOrientada aos Componentes Familiar aos programadores de Java/C++Familiar aos programadores de Java/C++ Resolve algumas das fraquezas do Java (e Resolve algumas das fraquezas do Java (e

do C++) em termos de desenvolvimento de do C++) em termos de desenvolvimento de software software (não resolve tudo)(não resolve tudo)

Page 35: A linguagem C#

Conclusão (2)Conclusão (2)

C# -- Pontos negativosC# -- Pontos negativos Gestão de ExcepçõesGestão de Excepções Herda uma certa idiomática do PascalHerda uma certa idiomática do Pascal Algumas Algumas featuresfeatures algo obscuras, algo obscuras,

outras perigosasoutras perigosas

Page 36: A linguagem C#

Perguntas?Perguntas?