You are on page 1of 56

Introduo Linguagem de Programao C#

Introduo Linguagem de Programao C#


Joo Pascoal Faria FEUP 10 de Setembro de 2001
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Objectivo
?

Apresentar os elementos fundamentais da linguagem C# Enfatizar conceitos comuns ao framework Microsoft .NET Enfatizar novidades Deixar para leitura posterior alguns tpicos mais avanados (diapositivos com asterisco)

? ?

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

ndice
? ? ? ? ? ? ? ? ? ? ? ? ?

O meu primeiro programa em C# Introduo ao framework Microsoft .NET Objectivos do C# Sistema de tipos Classes Estruturas, interfaces, enumeraes e arrays Delegados (apontadores para funes OO) e eventos Operadores e instrues Tratamento de excepes Sobrecarga de operadores Atributos (anotaes tipadas) Interoperao com cdigo no gerido pelo .NET runtime Outros tpicos: documentao em XML, compilao condicional *, assemblies (componentes), reflexo, multithreading *

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

O meu primeiro programa em C#

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

"Hello, World" em C#
ponto de entrada por omisso de um programa em C#

class HelloWorld { public static void Main() { System.Console.WriteLine("Hello world"); } }


espao de nomes mtodo esttico (partilhado)

classe da biblioteca de classes do framework Microsoft .NET (acessvel a partir de qualquer linguagem compilada para este framework!)
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Compilao para MSIL


HelloWorld.cs
Microsoft Intermediate Language

C Sharp Compiler

csc HelloWorl HelloWorld.cs

HelloWorl HelloWor ld.exe

Windows Portable Executable com com: : - cdigo em MSIL - meta meta- informao - chamada da da funo _CorExeMain de mscoree.dll (do .NET .NET) )

_CorExeMain responsvel por manda mandar r compilar Just In Time o cdigo MSIL (do mtodo Main Main) ) para cdigo mquina, mquina, e mandar executar o cdigo mquina Tambm possvel compilar o cdigo MSIL no momento da instalao
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

"Hello, World" em MSIL *


Cdigo do mtodo Main obtido com o ildasm (Intermediate Language Disassembler):
.method public hidebysig static void Main() il managed { .entrypoint // Code size .maxstack 8 11 (0xb)

IL_0000: ldstr "Hello, World" IL_0005: call void ['mscorlib']System.Console.WriteLine(class System.String) IL_000a: ret } // end of method 'Hello:Main'

carrega string para a stack

Assembly

tipo de parmetro a retirar da stack

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Introduo ao Framework Microsoft .NET

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

A Linguagem C# e o Framework Microsoft .NET


? ? ?

C# nasceu com o .NET C# foi desenhado medida do .NET C# a linguagem que melhor reflecte as caractersticas do .NET Milhes de linhas de cdigo do .NET escritas em C#

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

10

Compliant Languages

O Framework .NET
VB C++ C++ C# JScript Studio.NET Visual Studio.NET

Common Language Specification ASP.NET: Web Services And Web Forms Windows Windows forms

Class Libraries

ADO.NET: Data and XML Base Class Library Common Language Runtime Runtime

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Fonte: Manuel Costa, Microsoft Portugal

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

11

Common Language Runtime (CLR)


?

O CLR faz a gesto em tempo de execuo do cdigo conforme com o Framework .NET
? ? ?

Gesto automtica de memria (garbage collector - GC) Gesto de threads Gesto de segurana
?

controlo de acesso a recursos sensveis (ficheiros, rede, etc.) conformidade com o CTS (Common (Common Type System) System) type safety cdigo acede apenas a localizaes de memria a que est autorizado a aceder (se verificao falhar, lana excepo) compilao just in time (JIT) de MSIL para cdigo mquina

Verificao de cdigo
? ?

Compilao de cdigo
?

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

12

Programas Hospedeiros (runtime hosts)


?

O .NET Framework inclui diversos programas hospedeiros (runtime hosts ) para aplicaes .NET Um programa hospedeiro um componente no gerido que carrega o CLR para o seu processo e inicia a execuo de cdigo gerido Programas hospedeiros:
?

ASP.NET carrega o runtime para o processo que ir tratar o pedido Web; cria um domnio aplicacional (processo lgico gerido pelo CLR) CLR) para cada aplicao Web que ir correr num servidor Web Internet Explorer cria domnios aplicacionais (por defeito, um para cada Web site) para correr controlos Windows Forms embebidos em documentos HTML; comunicao entre CLR e IE atravs de filtros M IME Executveis shell controlo transferido para cdigo de hospedagem cada vez que um executvel lanado pela shell (ver HelloWorld HelloWorld) )

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

13

Common Language Specification (CLS)


?

Especificao de subconjunto de features do CTS a que as linguagens e compiladores devem obedecer, para garantir a interoperabilidade de programas escritos em diferentes linguagens
?

Possibilidade de, numa linguagem, usar (ou at mesmo estender) uma classe ou outro tipo definido noutra linguagem Apenas interessa para partes de um programa que precisam de interagir com outros programas escritos noutras linguagens

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

14

Bibliotecas de Classes

ASP.NET

ADO.NET

Base Class Library

Fonte: Tom Archer, "Inside C#"


Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

15

Objectivos do C#

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

16

Objectivos do C#
? ? ? ?

Orientao a componentes Orientao a objectos Robustez Preservar investimentos

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

17

Orientao a Componentes *
?

Apresentada como primeira linguagem Orientada por Componentes da famlia C/C++ Consideraes de evoluo de verses pensadas na linguagem Componentes autoauto -descritivos
?

Metadados, incluindo atributos definidos pelo utilizador, consultados em tempo de execuo atravs de reflexo Documentao integrada em XML

? ?

Suporte para propriedades, mtodos e eventos Programao simples


? ?

No existem .h, IDL, etc. Pode ser utilizada em pginas ASP

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

18

Orientao a Objectos *
? ?

Tudo um objecto Herana simples de implementao e herana mltipla de interface (como em Java Java) ) Polimorfismo a la carte com mtodos virtuais (como em C++) Membros estticos (partilhados) e de instncia (como C++ e Java Java) ) Vrios tipos de membros:
? ?

campos, mtodos, construtores e destrutores: propriedades, indexadores, eventos e operadores (como C++)

No tem templates

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

19

Robustez *
?

Gesto automtica de memria (garbage collection) collection )


?

Elimina problemas com fugas de memria e apontadores invlidos Mas quem quiser pode trabalhar directamente com apontadores Melhor tratamento de erros Elimina variveis no inicializadas, coero insegura de tipos, etc.

Excepes
?

Segurana de tipos (type type-safety)


?

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

20

Preservar Investimentos *
?

Semelhanas com C++ e Java


? ?

Espaos de nomes, apontadores (em cdigo unsafe unsafe), ), etc. Nenhum sacrifcio desnecessrio Cada vez mais importante C# fala com XML, SOAP, COM, DLLs DLLs, , e qualquer linguagem do .NET Framework Pequena curva de aprendizagem Melhor produtividade

Interoperabilidade
? ?

Milhes de linhas de cdigo C# no .NET


? ?

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

21

Sistema de Tipos

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

22

Tipos Valor e Tipos Referncia


?

Tipos valor (value types)


? Variveis
? No

contm directamente dados/instncias


e atribuio operam com os prprios valores (em C#) eficiente porque dados podem ser alocados na stack

podem ser null (Nothing em VB)

? Comparao ? Manipulao

Tipos referncia (reference types)


? Variveis
? Podem

contm referncias para objectos/instncias (no heap)


ser null (Nothing em VB) e atribuio operam com as referncias (em C#) automtica de memria (garbage collector do CLR)

? Comparao ? Gesto

int i = 123; string s = "Hello, world";

i s

123 "Hello, world"

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

23

Tipos Valor e Tipos Referncia


?

Tipos Valor
? ? ?

Primitivos Enumeraes Estruturas

int i; (de facto tambm so estruturas!) estruturas !) enum State { Off, On } struct Point { int x, y; }

Tipos Referncia
? ? ? ?

Arrays Classes Interfaces Delegados

string[] a = new string[10]; class Foo Foo: : Bar, IFoo {...} interface IFoo IFoo: : IBar {...} delegate double MathFunc MathFunc(double (double x);

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

24

Tipos Pr -definidos em C#
Classes CTS Type Name System.Object System.String System.SByte System.Byte System.Int16 System.UInt16 System.Int32 System.UInt32 System.Int64 System.UInt64 System.Char System.Single System.Double System.Boolean System.Decimal C# Alias object string sbyte byte short ushort int uint long ulong char float double bool decimal Description Base class for all CTS types String Signed 8-bit byte Unsigned 8-bit byte Signed 16-bit value Unsigned 16-bit value Signed 32-bit value Unsigned 32-bit value Signed 64-bit value Unsigned 64-bit value 16-bit Unicode character IEEE 32-bit float IEEE 64-bit float Boolean value (true/false) 128-bit data type exact to 28 or 29 digits mainly used for financial applications

Estruturas

int i = 1; 1;

string s = i.ToString() + 123.ToString();


Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

25

Tudo um Objecto
?

Todos os tipos (mesmo tipos valor) derivam de object e podem ser tratados como objectos Concilia eficincia com simplicidade
? ?

instncias de tipos valor so guardadas na stack no h wrapper classes com em Java (graas a mecanismo de boxing e unboxing ver a seguir) coleces funcionam com todos os tipos object

string

Stream

Hashtable FileStream

int

double

MemoryStream

...

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

26

Boxing e Unboxing
? ?

Boxing converso de tipo valor para tipo referncia Unboxing converso de tipo referncia para tipo valor
stack i o 123

int i = 123; // upcast object o = i; // downcast explcito int j = (int)o; // outra forma int j = o as int;

boxing
heap
System.Int32

123

123

unboxing

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

27

Espaos de Nomes (namespaces)


?

Programa constitudo por declaraes de tipos (classes, interfaces, interfaces, estruturas, etc.) dentro de espaos de nomes
?

cdigo escrito inline inline; ; ordem de declarao irrelevante

? ? ?

? ?

Um espao de nomes pode conter tipos (classes, estruturas, etc.) e outros espaos de nomes Tipos declarados fora de qualquer espao de nomes ficam num espao de nomes global Vrios ficheiros de cdigo fonte podem contribuir para o mesmo espao de nomes, mas cada tipo tem de ser definido num nico ficheiro Para minimizar conflitos, aconselhvel usar o nome da empresa seguido do produto ou projecto (exemplo: Novabase.CSI.LockMngr Novabase.CSI.LockMngr) ) Instrues:
? ? ?

using nome nome-de de- espao espao-de de-nomes; using alias = nome nome-de de-classe; namespace nome nome-de de-espao espao-de de-nomes { declaraesdeclaraes- de de-tipos tipos-e-espaos espaos-de de-nomes }

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

28

Espaos de Nomes
Exemplo *
namespace N1 // nome completo: { class C1 // nome completo: { class C2 // nome completo: { } } namespace N2 // nome completo: { class C2 // nome completo: { } } } namespace N1.N2 { class C3 // N1.N2.C3 { } } N1 N1.C1 N1.C1.C2

N1.N2 N1.N2.C2 using using MyC2 MyC2 = = N1.N2.C2; N1.N2.C2; using using N1; N1; class myClass class myClass { { C1 C1 c1; c1; // // N1.C1 N1.C1 MyC2 MyC2 c2; c2; // // N1.N2.C2 N1.N2.C2 } }

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

29

Classes

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

30

Classes
?

{ Membros }
? ? ?

Campos, mtodos, constantes, propriedades, indexadores, operadores, construtores, destrutores, eventos, tipos nested mbito: estticos (partilhados) ou de instncia Acessibilidade: Acessibilidade : private (por omisso), omisso), protected, public ou internal (mesma unidade de compilao; combinao ou c/ protected) herana de 0 ou 1 uma classe base
? ?

: Bases
?

por omisso System.Object so herdados todos os membros excepto construtores e destrutores

implementao de 0 ou mais interfaces base Acessibilidade: public, private, protected, internal ...

Modificadores
? ?

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

31

Campos (fields)
Conceitos
? ?

Guardam dados mbito:


? ?

campos de instncia alocados em cada instncia da classe, para guardar dados da instncia campos estticos (static) ou partilhados (VB) alocados uma vez para toda a classe, para guardar dados partilhados por todas as instncias

Campo imutvel (readonly) guarda valor imutvel definido pelo construtor (ou inicializador) no momento da execuo
?

podem ser estticos seno so inicializados com valor por omisso do respectivo tipo

Podem ter inicializador


?

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

32

Campos (fields)
Exemplo
using Date = System.DateTime; public class Factura { // campos (private por omisso) static int ultimoNumero = 0; readonly int numero = ++ultimoNumero; Date data = Date.Today; decimal valor; public Factura(decimal valor) // constructor { this.valor = valor; } public override string ToString() // mtodo { return "Factura nmero=" + numero.ToString() + " data=" + data.ToShortDateString() + " valor=" + valor.ToString("C"); } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

33

Campos (fields)
Exemplo ( cont.)
class FacturaApp { public static void Main() { System.Console.WriteLine(new Factura(10000)); System.Console.WriteLine(new Factura(20000)); } }

Factura Factura Factura Factura

nmero=1 nmero=1 nmero=2 nmero=2

data=23data=23 -07 07-2001 data=23-07-2001 data=23 data=230707 -2001 data=23-07-2001

valor=10.000$00 valor=10.000$00 valor=20.000$00 valor=20.000$00

Esc. Esc. Esc. Esc.

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

34

Mtodos
Conceitos
?

mbito:
?

Estticos (partilhados) (static )


?

invocados com classe.mtodo

De instncia (por omisso)


? ?

invocados com objecto.mtodo objecto parmetro implcito (this)

Overloading
?

vrios mtodos com o mesmo nome e diferentes tipos de parmetros

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

35

Mtodos
Tipos de Parmetros
? ?

Parmetros valor, s de entrada (default) Parmetros referncia de entrada e sada (ref)


?

obrigatrio passar variveis j inicializadas

Parmetros referncia s de sada (out)


?

permite passar variveis no inicializadas

class Calculator { private double mem; public void Store(double x) { mem = x; } public void Load(out Load(out double x) { x = mem; } public void Exchange(ref Exchange(ref double x) { double old_mem = mem; mem = x; x = old_mem;} }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

36

Mtodos
Argumentos Variveis *
?

Mtodos podem aceitar um n varivel de argumentos do mesmo tipo (no limite object , i.e., qualquer tipo) DeclaraDeclara - se parmetro do tipo array com params
? ?

Podem existir parmetros anteriores normais (sem param) PodemPodem -se passar vrios argumentos ou um array

class VarArgsApp { public static double Sum(params double[] nums) { double sum = 0; foreach (double x in nums) sum += x; return sum; } public static void Main() { System.Console.WriteLine(Sum(1.0, 2.0, 3.0)); } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

37

Herana e "Substitutabilidade"
using System;
Herda implicitamente de System.Object

class C1 { public void F1() {Console.WriteLine("F1");} }


Herda membrosde C1 e acrescenta F2

class C2: C1 { public void F2() {Console.WriteLine("F2");} } class C3: C2 { public void F3() {Console.WriteLine("F3");} }

class InheritanceApp { public static void Main(){ C1 c1 = new C1(); C2 c2 = new C2(); C3 c3 = new C3(); // herana c2.F1(); c3.F1(); c3.F2(); // substitutabilidade c2 = c3 c3; c1 = c2 c2; c1 = c3; }
Onde se espera um objecto da classe base (C1) podepode-se passar um objecto de uma classe derivada (C3)

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

38

Upcast e Downcast *
?

Upcast converso de classe derivada para classe base (ao nvel de referncias)
? ?

Sempre possvel de acordo com princpio da "substitutabilidade" No precisa de cast explcito

Downcast converso de classe base para classe derivada (ao nvel de referncias)
? ?

Tem de se fazer um cast explcito com (type type) ) ou as type S possvel se objecto referenciado for da classe derivada (ou de uma terceira classe derivada desta)
?

Se assim no for,
? ?

"(type "( type) )objref " d excepo System. System.InvalidCastException InvalidCastException " objref as type type" " d null

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

39

Mtodos Virtuais e Polimorfismo


using System;
pode ser overriden

class A { public virtual void F() {Console.WriteLine("A.F");} }


substitui implementao de mtodo virtual herdado, para objectos da classe derivada

class B: A { public override void F() {Console.WriteLine("B.F");} }


Utilizao explcita de override reduz

class PolymorphismApp { o problema da classe base frgil public static void Main(){ B b = new B(); A a = b; mtodo chamado depende do tipo do objecto a.F(); // B.F referenciado (determinado em tempo de execuo late binding) e no do tipo da varivel que b.F(); // B.F guarda a referncia (determinado em tempo de } compilao early binding) }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

40

Esconder Membros Herdados


?

Modificador new usado na definio de um novo membro (mtodo, tipo nested, etc.) que esconde um membro herdado com o mesmo nome (e assinatura, no caso
de mtodos e similares)
?

Utilizao explcita de new reduz problema da classe base frgil

class A { public virtual void F() { ... } } class B: A { public new void F() { ... } } class DemoApp { public static void Main(){ B b = new B(); A a = b; a.F(); // chama A.F (no h polimorfismo) b.F(); // chama B.F } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

41

Classes e Mtodos Abstractos


?

Classe abstracta: no pode ser instanciada (s classes derivadas podem ser instanciadas) Mtodo abstracto: no tem implementao na classe em que declarado (s em classes derivadas)
? ?

Classe tem de ser abstracta implicitamente virtual (mas no leva virtual)

public abstract class Shape { public abstract void Resize(double factor); public void DoubleSize() { Resize(2.0 Resize(2.0); ); } } public class Box: Shape { public override void Resize(double factor) { ... } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

42

Classes e Mtodos Selados


?

Classe selada: no pode ser usada como base doutra classe


sealed class X {} class Y : X {} // Erro!

Mtodo selado: no pode ser overriden


class A { public virtual void F() {} } class B : A { public sealed override void F() {} } class C: B { public override void F() {} } // Erro!

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

43

Construtores de Instncia
?

So mtodos com mesmo nome da classe, usados para inicializar novas instncias da classe Podem ter parmetros (passados a new) Podem ser overloaded No tm valor de retorno (mas no levam void ) Podem invocar no inicializador um construtor da classe base base(...) ou outro construtor da mesma classe this(...) this (...) - por omisso, invocado base()
class B : A { public B(int x) : base(x) { } } inicializador

? ? ? ?

class A { private int x; public A(int x) { this.x = x; } }

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

44

Construtores Estticos *
?

Cada classe pode ter um construtor esttico (static) para inicializar a classe (normalmente inicializar campos estticos) Construtor esttico no tem tipo de retorno nem parmetros

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

45

Destrutores *
?

So mtodos com nome da classe precedido de "~", usados para "destruir" um objecto que vai ser libertado de memria
? ?

So chamados pelo garbage collector Um objecto pode ser libertado de memria a partir do momento em que no pode ser usado por nenhuma parte do cdigo

Destrutores no tm parmetros nem valor de retorno (mas no levam void) Correspondem a mtodo Finalize no CLR, implementado desde System System. .Object

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

46

Constantes
?

Valor constante definido no momento da compilao


?

Difere de campo imutvel, cujo valor pode ser definido no momento da execuo

? ?

Sintaxe: campo com prefixo const e inicializao So membros estticos (partilhados), mas no levam static

namespace System { public sealed class Math { public const double PI = 3.14159265358979323846; public const double E = 2.7182818284590452354; ... } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

47

Propriedades
?

So smart smart fields fields


? ? ?

Usados como campos Implementados por mtodos set e/ou get Podem ser virtuais, abstractos, estticos, etc. (como mtodos)

public class Button: Control { private string caption; public string Caption { get { return caption; } set { caption = value value; ; Repaint(); } } Button b = new Button(); b.Caption = "OK"; string s = b.Caption;

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

48

Indexadores (indexers)
?

So smart smart arrays arrays


? ? ? ? ?

Permitem usar objectos como arrays Implementados por mtodos set e/ou get Podem ser overloaded Podem ser virtuais, abstractos, etc. (como mtodos) Mapeados para propriedades com argumentos no CTS

public class ListBox: Control { private string[] items; public string this[ this[int int index] index] { get { return items[index]; } set { items[index] = value value; ; Repaint(); } } ListBox listBox = new ListBox(); } listBox[0] = "hello"; Console.WriteLine(listBox[0]);
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

49

Estruturas, Interfaces, Enumeraes e Arrays

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

50

Estruturas
?

Como classes, excepto


?

So tipostipos-valor em vez de tipostipos-referncia


?

Atribuio copia valor (dados) em vez de referncia

Sem herana (mas herdam implicitamente de object e podem implementar interfaces) Sem destrutores Campos de instncia no podem ter inicializadores int, int , float, double, double , etc., so estruturas complex, point, rectangle, color, ...

? ?

Ideal para objectos leves


? ?

Utilizao mais eficiente da memria

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

51

Estruturas versus Classes


struct SPoint { int x, y; ... } SPoint sp1 = new SPoint(10, 20); Spoint sp2 = sp1; sp2.setX(5); sp1 10 20 5 20 class CPoint { int x, y; ... } CPoint cp1 = new CPoint(10, 20); Cpoint cp2 = cp1; cp2.setX(5); cp1 cp2 5 20
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

sp2

CPoint

52

Interfaces
? ?

Um interface define um contracto ao qual tem de aderir qualquer classe ou estrutura que o implemente Membros: mtodos, propriedades, eventos e indexadores
?

sem implementao
?

a fornecer por classes ou estruturas que implementam o interface

? ?

implicitamente pblicos e de instncia (no estticos) podepode -se usar new para esconder membro herdado
um interface pode herdar de mltiplos interfaces uma classe ou estrutura pode implementar mltiplos interfaces

Herana mltipla:
? ?

? ?

Nome: habitual comear com letra "I" Modificadores: acessibilidade e new (em tipos nested)

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

53

Interfaces
Exemplo
public delegate void StringListEvent(IStringList sender); public interface IStringList { void Add(string s); int Count { get; } event StringListEvent Changed; string this[int index] { get; set; } } public class StringList : IStringList { private string[] strings; public void Add(string s) { ... } public int Count { get {return strings.Length} } public event StringListEvent Changed; public string this[int index] { get{...} set{...} } }

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

54

Interfaces
Herana entre Interfaces
interface IControl { void Paint(); } interface ITextBox: IControl { void SetText(string text); } interface IListBox: IControl { void SetItems(string[] items); } interface IComboBox: ITextBox, IListBox {} class MyComboBox : IComboBox { public void Paint() { ... } public void SetText(string text) { ... } public void SetItems(string[] items) { ... } }

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

55

Interfaces

Implementao explcita *
interface IDataBound { void Bind(IDataBinder binder); } class EditBox: Control, IDataBound { void IDataBound.Bind(IDataBinder binder) {...} }

Nome completamente qualificado (com prefixo que indica interface em que foi especificado) s pode ser acedido atravs de instncia do interface

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

56

Enumeraes
? ? ?

Definem conjuntos de constantes simblicas Converso de/para inteiro, mas s explcita Operadores aplicveis:
? ? ?

comparao: == > < >= <= != bitbit -a-bit: & | ^ ~ outros: + - ++ -- sizeof byte, sbyte, short, ushort, int, uint, long ou ulong enum Color: byte { Red = 1, Green = 2, Color c = Color.Red; Blue = 4, Black = 0, White = Red | Green | Blue }

? ?

Pode especificarespecificar-se o tipo subjacente (por omisso int)


?

Herdam implicitamente de System.Enum

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

57

Arrays uni-dimensionais
?

Declarao com tipo de array e nome:


?

int[] a; // array uniuni- dimensional de elementos do tipo int

Criao (alocao):
? ?

a = new int[4]; // cria array de 4 inteiros Tamanho determinado ao criar (em tempo de execuo)

? ?

ndices so inteiros e comeam em 0 Inicializados com valores por omisso do respectivo tipo, ou com valores (constantes) dados explicitamente:
?

new int[] {1, 2, 3}; ou: new int[3] {1, {1, 2, 3}; 3};

Converso entre arrays do tipo A[] e B[] realizarealiza-se nas mesmas condies que converso entre tipos A e B
?

object[] aceita qualquer array uni uni-dimensional

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

58

Arrays de Arrays *
?

Declarao
?

int[][] a; //array uni uni- dimensional de elem' elem's do tipo int[]

Utilizao
?

int[] ai = a[i]; int aij = a[i][j];

SubSub -arrays tm de ser criados um a um


? ?

int[][] a = new int[100][5]; // Erro int[][] a = new int[100][]; // Ok for (int i = 0; i < 100; i++) a[i] = new int[5];

SubSub -arrays podem ter tamanhos diferentes


?

int[][] matrizTriang = new int[10]; for (int i = 0; i < 10; i++) matrizTriang[i] = new int[i+1];

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

59

Arrays multi-dimensionais *
?

Declarao
?

int[,] m; // //array array bibi-dimensional de int's

Criao
?

m = new int[4,3]; // array 4x3

Inicializao
? ?

new int[,] {{0, 1}, {2, 3}, {4, 5}}; new int[3, 2] {{0, 1}, {2, 3}, {4, 5}};//equiv.

Converso
? ?

S entre arrays com o mesmo n de dimenses Tipo object[,] aceita qualquer array bi bi-dimensional

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

60

Arrays
Mtodos e propriedades
?

Herdam implicitamente de System System. .Array


?

Mtodos estticos: BinarySearch, Clear, Copy, IndexOf, LastIndexOf, Reverse Reverse, , Sort, Sort , CreateInstance, ... Propriedades de instncia: Length (d o n total de elementos em todas as dimenses do array array), ), Rank (n de dimenses do array array) ) Mtodos de instncia: Clone Clone, , Equals Equals, , GetLength (n de elementos numa dada dimenso),...

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

61

Delegados e Eventos

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

62

Delegados (Delegates)
?

So apontadores para funes orientados por objectos Tipo de delegado


?

Sintaxe: assinatura de mtodo com a palavra chave delegate Implicitamente derivado de System.Delegate

Instncia de delegado
?

Encapsula zero ou mais entidades invocveis - mtodos estticos ou de instncia, com assinatura idntica definida no tipo de delegado

Usado como objecto (em atribuies, passagem de parmetros, etc.) ou como mtodo (para invocar indirectamente as entidades nele encapsuladas)

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

63

Delegados
Exemplo
using System; class DelegateApp { // Declarao do tipo de delegado (assinatura) public delegate void IntFunc(int n); // Mtodo a chamar indirectamente static void F(int n) { Console.WriteLine("F called with n={0}", n); } public static void Main() { // Instanciao do delegado delegado IntFunc func = new IntFunc(F); // Invocao indirecta de mtodo func(1); } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

64

Delegados *
Composio e multicasting
class MulticastingApp { delegate void IntFunc(int n); static void F1(int n) { System.Console.WriteLine("F1 called with n={0}", n); } static void F2(int n) { System.Console.WriteLine("F2 called with n={0}", n); } public static void Main() { // Instanciao do delega delegado do com composio IntFunc funcs = (new IntFunc(F1)) + (new IntFunc(F2)); // Chamada indirecta de F1(1) seguido de F2(1) // (multicasting) funcs(1); } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

65

Eventos
Definir e disparar
// tipo de delegado que define a assinatura do evento public delegate void EventHandler(object sender, EventArgs e); public class Button { // campo que define o evento e memoriza handlers public event EventHandler Click; // mtodo que dispara o evento // (normalmente escondido de clientes) protected void OnClick(EventArgs e) { if (Click != null) Click(this, e); // dispara aqui } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

ou classe derivada

66

Eventos
Registar handler e tratar
using System.Windows.Forms; public class MyForm: Form { Button okButton; public MyForm() { okButton = new Button(); regista handler okButton.Text = "OK"; okButton.Click += new EventHandler(OkButtonClick); Controls.Add(okButton); trata evento Show(); } void OkButtonClick(object sender, EventArgs e) { MessageBox.Show("You pressed the OK button"); } public static void Main(string[] args) {Application.Run(new MyForm());} }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

67

Eventos
Detalhes *
?

A assinatura do evento (ou melhor, dos mtodos que tratam o evento) evento ) definida por um delegado com dois parmetros:
?o

objecto que disparou o evento ? um objecto da classe System System. .EventArgs ou classe derivada, com informao sobre o evento
?

O evento definido num membro com a palavrapalavra-chave event,


seguida do nome do tipo de delegado que define a assinatura do evento, seguido do nome do evento
? esse

campo guarda a lista de mtodos que tratam o evento ( handlers ) += new delegate delegate-type(mtodo)

Registar um mtodo que trata o evento:


? evento

Disparar evento: evento( obj ,args )


? mtodos

? previamente testa testa-se se no (i.e., Inroduo Linguagem de Programao C#, Joo Pascoal Faria, FEUP, 10 null de Setembro de 2001

registados so invocados sequencialmente se h subscritores)

68

Operadores e Instrues

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

69

Operadores e Instrues
?

So basicamente os mesmos do C/C++, com alguns melhoramentos para evitar erros comuns
?

Instrues sem qualquer efeito so proibidas


i == 0; // Instruo no vlida! vlida!

Condies em if, while, for tm de ser do tipo bool ou de um tipo convertvel explicitamente para bool (no h converso implcita de int para bool)
int i = 1; 1; if (i) ... // Errado! if (i != 0) .... // Certo!

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

70

Instruo switch *
? No

faz fall fall-through, requer "goto case" ou "goto default"


switch(opcao) { case 'a': case 'A': // Certo adicionar(); goto case 'R'; // D erro se no tiver isto! case 'R': refrescar(); break; // Opcional no ltimo case ou default }

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

71

Instruo foreach
?

foreach (type identifier in expression ) embeddedembedded -statement

Iterao sobre arrays


public static void Main(string[] args) { foreach (string s in args) Console.WriteLine(s); }

Iterao sobre coleces


void Display(System.Collections.ArrayList words) { foreach (string s in words) Console.WriteLine(s); }

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

72

Tratamento de Excepes

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

73

Tratamento de Excepes
Lanar excepo
?

throw <instncia de System.Exception ou de classe derivada> derivada >

using System; class Fraccao { private int numerador, denominador; public Fraccao(int numerador, int denominador) { if (denominador == 0) throw new ArgumentException("denominador=0!"); this.numerador = numerador; this.denominador = denominador; } classe declarada no namespace System e } derivada indirectamente de System.Exception
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

74

Tratamento de Excepes
Apanhar e tratar excepo
?

try {instrues} catch (excepo) {instrues}


opt

class FraccaoApp { public static void Main() { try { Fraccao f = new Fraccao(1,0); } catch(Exception e) apanha excepes desta classe ou de { classes derivadas Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } } }
denominador=0! at Fraccao..ctor(Int32 numerador, Int32 denominador) at FraccaoApp.Main()

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

75

Tratamento de Excepes
Outras features *
?

Podem-se ter vrios blocos catch seguidos, para Podemapanhar excepes de diferentes classes
?

blocos mais "especializados" devem estar depois de blocos de mais "genricos" (seno nunca so executados)

? ?

PodePode -se relanar excepo com throw sem parmetros Pode-se lanar nova excepo que inclui a original Pode(como inner exception) Pode-se definir um bloco finally {} a seguir a try e Podecatch, com cdigo que executado em qualquer caso
?

PodePode -se ter try try{} {} finally finally{} {} sem catch

Excepo no apanhada ? aplicao abortada

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

76

Sobrecarga (Overloading) de Operadores

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

77

Overloading de operadores
?

Pode-se (re Pode(re)definir )definir o significado de operadores do C# para classes e estruturas definidas pelo utilizador De forma muito semelhante a C++ Conceito no suportado totalmente pelo CTS
?

? ?

mapeados para mtodos op_NomeDeOperador

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

78

Operadores Unrios e Binrios


Exemplo
public class Frac { int numerador, denominador; public Frac(int num, int denom) { this.numerador = num; this.denominador = denom;} public static Frac operator * (Frac f1, Frac f2) {return new Frac(f1.numerador*f2.numerador, f1.denominador*f2.denominador);} public static Frac operator * (Frac f, int c) {return new Frac(f.numerador * c, f.denominador);} public static Frac operator - (Frac f) { return new Frac(Frac(-f.numerador, f.denominador); } } Frac r1 = new Frac (1,3); Frac r2 = new Frac (3,1); Frac r3 = - r1 * r2 * 4;
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

79

Operadores Unrios e Binrios


Regras *
?

Mtodo com nome operator smbolo smbolo-de de-operador (re re)define )define esse operador para instncias da classe ou estrutura
?

operador fica overloaded porque tem vrias definies dependendo dos tipos dos parmetros

Operadores que podem ser overloaded overloaded: :


? ?

unrios: +

- ! ~ ++ -- true false

binrios: + - * / % & | ^ << >> == != > < >= <=

? ?

Tm de ser public e static , c/ parmetros por valor Pelo menos um dos parmetros tem de ser da classe ou estrutura em que o operador declarado

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

80

Operadores de Converso
Exemplo
public struct Digit { byte value; public Digit(byte value) { if (value < 0 || value > 9) throw new ArgumentException(); this.value = value; } public static implicit operator byte(Digit byte(Digit d) { return d.value;} public static explicit operator Digit(byte Digit(byte b) { return new Digit(b);} Digit d1 = new Digit(4); } byte x = d1; // OK Digit d2 = x; // MAL porque pode lanar excepo Digit d3 = (Digit)x; // OK
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

81

Operadores de Converso
Regras *
?

Mtodo com nome operator nome nome-de de-tipo especifica a converso de instncias da classe ou estrutura de/para outro tipo (classe ou estrutura)
? ?

de: tipo do parmetro para: tipo (do resultado) a seguir a palavrapalavra- chave operator

Converso pode ser implicit ou explicit


?

converso explcita: invocada com operadores de cast


?

aconselhvel quando h perda de informao ou lanamento de excepes

? ?

Tm de ser public e static , c/ parmetros por valor No se podem redefinir converses prpr -definidas

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

82

Atributos

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

83

Atributos
Conceitos
?

So anotaes "tipadas " tipadas", ", que podem ser associadas (como metadados) a diversos elementos de um programa (tipos, membros, parmetros, valores de retorno, mdulos e assemblies )
? ? ?

URL de documentao para uma classe Nome de um campo em XML Propriedades transaccionais de um mtodo, etc.

Vantagens: informao mais integrada e consistente, dispensa ficheiros externos (.IDL, .DEF, etc.), componentes autoauto-descritivos Valores de atributos indicados entre [ ] antes dos elementos a que que se referem (entre < > em VB) Tipos de atributos so classes derivadas de System.Attribute Consultados em tempo de execuo atravs de reflexo Usados intensivamente por muitos servios do .NET (XML, COM,...)

? ? ?

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

84

Atributos
Definio
[AttributeUsage(AttributeTargets.All)] public class DeveloperAttribute : System.Attribute { // Este construtor define um parmetro obrigatrio public DeveloperAttribute(string name) { this.name = name; } private string name; public string Name { get { return name; } } // Esta propriedade define um parmetro opcional private bool reviewed = false; false; public bool Reviewed { get { return reviewed; } set { reviewe reviewed = value; } } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

85

Atributos
Aplicao
"Attribute" automaticamente acrescentado ao nome Parmetros obrigatrios (parmetros do construtor) primeiro, pela ordem definida Parmetros opcionais (propriedades ou campos pblicos) depois, com nome=valor

[Developer("Joao Pascoal Faria", Reviewed = true)] class DemoApp { [Developer("JPF")] public static void Main() { QueryDevelopers.QueryType(typeof(DemoApp)); } } Operador do C#, devolve
instncia de System.Type
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

86

Atributos
Consulta
using System; using System.Reflection; class QueryDevelopers { public static void QueryType(Type t) { Console.WriteLine("Type: {0}", t.FullName); QueryMember(t); foreach (MethodInfo m in t.GetMethods t.GetMethods()) ()) { Console.WriteLine("Method: {0}", m.Name); QueryMember(m); } } // ...
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

87

Atributos
Consulta (cont.)
// ... private static void QueryMember(MemberInfo m) { foreach(Attribute a in m.GetCustomAttributes m.GetCustomAttributes(false)) (false)) { if (a is DeveloperAttribute) { DeveloperAttribute d = (DeveloperAttribute)a; Console.WriteLine("Developer: {0}", d.Name); Console.WriteLine("Reviewed : {0}", d.Reviewed); } } ... ... Type: DemoApp DemoApp } Type: Method: Developer: Joao Pascoal Faria Method: ToString ToString } Developer: Joao Pascoal Faria Method: Main Reviewed : True Method: Main Reviewed : True Developer: JPF Method: GetHashCode Developer: JPF Method: GetHashCode Reviewed : False Method: Equals Reviewed : False Method: Equals Method: GetType ... Method: GetType ...
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

88

Atributos *
Outras features
?

Quando atributo no tem parmetros, dispensamdispensam-se parntesis Para resolver ambiguidade acerca do elemento a que se refere um atributo, podepode-se usar um prefixo como em
?

[return: return:HRESULT] HRESULT] public long F() (){} {}

MetaMeta -atributo AttributeUsage:


?

Valores possveis de primeiro parmetro: Assembly, Module, Class, Class , All, etc. Tem dois parmetros opcionais:
?

AllowMultiple se pode ser definido vrias vezes para mesmo elemento Inherited se atributo herdado (por classes derivadas, etc.)

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

89

Interoperao com cdigo no gerido pelo .NET runtime

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

90

Casos de Interoperao
?

Platform Invocation Services (PInvoke PInvoke) ) permitem a cdigo gerido pelo CLR aceder a funes, estruturas e at callbacks em DLL's no geridas Unsafe code possibilidade de escrever em C# cdigo de "baixo nvel" (com apontadores, etc.) que no gerido pelo CLR COM interoperability:
? ? ?

cdigo gerido pode usar componentes COM via wrappers aplicaes COM podem usar servios .NET (no tratado aqui) expor uma classe .NET como um componente COM (no
tratado aqui)

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

91

Platform Invocation Services

Invocao de mtodo em DLL no gerida


// Exemplifica chamada de MessageBoxA de user32.dll using System; using System.Runtime.InteropServices; //DllImport class PInvoke1App { [DllImport("user32.dll")] static extern int MessageBoxA(int hWnd, string msg, string caption, int type);
Implementado externamente

public static void Main() { MessageBoxA(0, "Hello, World!", "This is called from a C# app!", 0); } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

92

Platform Invocation Services

Passagem de callback a DLL no gerida *


using System; using System.Runtime.InteropServices; using StringBuilder = System.Text.StringBuilder; class CallbackApp { [DllImport("user32.dll")] static extern int GetWindowText (int hWnd, StringBuilder text, int count); delegate bool CallbackDef(int hWnd, int lParam); [DllImport("user32.dll")] static extern int EnumWindows (CallbackDef callback, int lParam); static bool PrintWindow(int hWnd, int lParam) { StringBuilder text = new StringBuilder(255); GetWindowText(hWnd, text, 255); Console.WriteLine("Window caption: {0}", text); return true; } static void Main() { EnumWindows(new CallbackDef(PrintWindow), 0); } } Window Window caption: caption: Microsoft Microsoft PowerPoint PowerPoint - [C#.ppt] [C#.ppt] ... ...
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

93

Platform Invocation Services


Outras features de DllImport *
?

PodePode -se dar um nome local ao mtodo


?

[DllImport("user32.dll",EntryPoint="MessageBoxA")] static extern int MsgBox( ....);

Pode-se especificar o conjunto de caracteres (Ansi Pode(Ansi ou Unicode)


?

[DllImport("user32.dll",CharSet=CharSet.ANSI")] static extern int MessageBox( ....);

Pode-se especificar a forma como feito o marshaling de Podecada parmetro e do valor de retorno
?

[DllImport("user32.dll", CharSet=CharSet.Unicode)] static extern int MessageBox(int hWnd, [MarshalAs(UnmanagedType.LPWStr)] string msg, [MarshalAs(UnmanagedType.LPWStr)] string caption, int type); Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

94

Cdigo unsafe *
Apontadores
?

possvel trabalhar com apontadores para tipos valor, strings e arrays de tipos valor dentro de cdigo (mtodo ou bloco) marcado com unsafe Operadores como em C/C++:
? ? ? ?

& * ->

endereo acesso a objecto apontado acesso a membro de objecto apontado

++ -- aritmtica de apontadores (com arrays e strings)


Compilar com /unsafe

class UnsafeDemo { public static unsafe void Main() {

int a = 1; int *aPtr = &a; *aPtr = 2;


System.Console.WriteLine(a); } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

95

Cdigo unsafe *
Alocao de arrays na stack
?

type * ptr = stackalloc type [ nelems ];


class StackallocDemo { public static unsafe void Main() { const int size = 80; long* fib = stackalloc long[size]; long* p = fib; Ligeiramente mais *p++ = *p++ = 1; eficiente do que for (int i=2; i<size; ++i, ++p) alocar no heap ! *p = p[p[-1] + p[p[-2]; for (int i=0; i<size; ++i) System.Console.WriteLine (fib[i]); } }

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

96

Cdigo unsafe *
Apontadores para objectos geridos
?

Para usar endereo de componente de objecto gerido pelo garbage collector (GC) (GC), , necessrio garantir que o mesmo no movido pelo GC, o que se faz com a instruo:
?

fixed (type * ptr = expression) statement

class FixedApp { class A {public int x;} Objecto "a" no public unsafe static void Main() movido durante a { execuo da instruo A a = new A(); fixed(int fixed (int *p = &a &a.x) *p = 1; System.Console.WriteLine("a. System.Console.WriteLine(" a.x={0}", x={0}",a a.x); } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

97

Invocao de componentes COM


Viso geral

Fonte: Tom Archer, "Inside C#"


Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

98

Invocao de componentes COM


Type Library associada ao componente COM

Importao da type library com TLBIMP


CSILockMngr.tlb

TLBIMP CSILockMngr.tlb /out:CSILockMngrMetadata.dll


Type Library Importer (do .NET SDK)

CSILockMngrMetadata.dll
Metadata wrapper, com informao que o .NET runtime pode compreender

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

99

Invocao de componentes COM


Visualizao do resultado com ILDASM
namespace classe

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

100

Invocao de componentes COM


Early binding
using System.Windows.Forms; using CSILockMngrMetadata; //CsiLockMngr,LockMode,... using System.Runtime.InteropServices; //COMException public class CsiLockMngrCLientApp { public static void Main() { try { CsiLockMngr lm = new CsiLockMngr(); LockReply reply = lm.Initialize("JPF"); reply = lm.Lock1("recurso", LockMode.LOCK_X, 0); MessageBox.Show("Lock1= " + reply.ToString()); } catch(COMException e) { Console.WriteLine("COM error message={0} code={2}", e.Message,e.ErrorCode); } } compilar com: /reference:CSILockMngrMetadata.dll }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

101

Invocao de componentes COM


Late binding *
... using System.Reflection; // BindingFlags ... Type t = Type.GetTypeFromProgID( Type.GetTypeFromProgID( "CsiLockMngr.CsiLockMngr"); object lm = Activator.CreateInstance Activator.CreateInstance(t); (t); ... object[] args = {"recurso", LockMode.LOCK_X, 0}; LockReply reply = (LockReply)t.InvokeMember (LockReply)t.InvokeMember("Lock1", ("Lock1", BindingFlags.Default | BindingFlags.InvokeMethod, null, lm, args); ... } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

102

Outros Tpicos

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

103

Documentao em XML
?

Compilador gera automaticamente documentao a partir do cdigo fonte, utilizando os comentrios XML (///)
?

e verifica consistncia entre comentrios e cdigo!

class XmlElement { /// <summary < summary> > /// Returns the attribute with the given name and /// namespace</summary> /// <param < param name="name"> /// The name of the attribute</param> /// <param < param name="ns"> /// The namespace of the attribute, or null if /// the attribute has no namespace</param> /// <return < return> > /// The attribute value, or null if the attribute /// does not exist</return> /// <seealso < seealso cref="GetAttr(string)"/> /// public string GetAttr(string name, string ns) { ... } csc } csc XmlElement.cs XmlElement.cs /doc:XmlElement.xml /doc:XmlElement.xml
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

104

Compilao Condicional *
? ? ?

#define, #undef #if, #elif, #else, #endif


?

Lgica booleana simples

Mtodos condicionais mais prtico

#define DEBUG using System; using System.Diagnostics; // tem ConditionalAttribute public class Trace { [Conditional("DEBUG")] public static void Msg(string msg) {Console.WriteLine(msg);} Mtodo e chamadas no so compilados } se #define DEBUG for retirado class Test { public static void Main() {Trace.Msg("Now in Main."); Console.WriteLine("Done.");} }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

105

Assemblies
Conceitos
?

Assembly
?

empacotamento num ficheiro fsico (.dll (.dll ou .exe .exe) ) de um manifesto, cdigo MSIL de um ou mais tipos (classes, interfaces, etc.), e zero ou mais recursos (bitmaps, JPEGs JPEGs , etc. etc.) ) unidade fundamental de construo, deployment deployment, , controlo de verses e controlo de segurana no framework .NET autoauto -descritivo e portvel
produto intermdio da compilao, com extenso ".netmodule " .netmodule", ", a adicionar a um assembly (faz as vezes de um .obj .obj) ) constituda por um ou mais assemblies , distribudos individualmente ou agrupados em ficheiros .CAB ou .msi .msi

? ?

Mdulo
?

Aplicao
?

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

106

Assemblies
Controlo de verses
? ? ? ?

N de verso composto por 4 segmentos: <major>. <major> . <minor> <minor>. . <build> <build>. .<revision> N de verso definido no cdigo fonte com atributo [assembly:AssemblyVersion("1 [assembly:AssemblyVersion(" 1.1.0.0")] O manifesto de um assembly contm o n de verso e a lista de assemblies referenciados e respectivas verses Poltica de verses por defeito: usar verso com n mais alto que coincide nos 2 primeiros segmentos (para cada
assembly referenciado)
? ?

se no for encontrado, lanada excepo outras polticas indicadas em ficheiro de configurao em XML

S so controlados assemblies com nomes fortes, registados na global assembly cache (com gacutil i assembly )

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

107

Assemblies
Nomes fortes (partilhados)
? ?

Usados para controlo de verses e segurana Nome forte consiste da identidade do assembly nome simples textual, n de verso e informao sobre cultura (se fornecida) reforado com uma chave pblica e uma assinatura digital
?

myDll, Version=1.1.0.0, Culture=en, PublicKeyToken=03689116d3a4ae33 PublicKeyToken=03689116d3a4ae33

1 - usar Strong Name tool (sn.exe sn.exe) ) para gerar ficheiro com par de chaves (pblica e privada)
?

sn k Teste.key

2 - indicar no cdigo fonte o ficheiro de chaves a usar


?

[assembly:AssemblyKeyFile("Teste.key")]

3 - compilador coloca automaticamente no manifesto as chaves pblicas dos assemblies referenciados Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
?

108

Reflexo
?

Possibilidade de consultar metameta-informao em tempo de execuo e mesmo criar novos tipos e gerar ("emitir") e executar cdigo MSIL Essencial para o .NET . NET runtime J visto anteriormente
? ?

? ?

consulta de atributos instanciao de objectos e invocao de mtodos com late binding (por nome)

Muitos outros casos de utilizao

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

109

Multithreading *
?

Classe Thread
? ? ?

instanciada com referncia para mtodo (com assinatura cf. delegado ThreadWorker ) que faz o trabalho mtodos: Start, Sleep, Suspend, Resume, Interrupt, Abort, ... propriedades: Priority, ... ambiente isolado para a execuo dos vrios threads de uma aplicao um processo lgico dentro de um processo fsico de um runtime host ASP.NET, IE ou shell sincronizao entre threads usando locks e sinais mtodos: Enter, Exit, TryEnter, Wait, Pulse, ...

Classe AppDomain
? ?

Classe Monitor
? ?

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

110

Mais Informao

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

Introduo Linguagem de Programao C#

111

C# no Visual Studio 6
? ?

Instalar o .NET Framework SDK Beta 2 Alterar a seguinte entrada no registry:


?

chave: HKEY_CURRENT_USER\ HKEY_CURRENT_USER \Software Software\ \Microsoft Microsoft\ \DevStudio DevStudio\ \6.0 6.0\ \Text Editor\ Editor \Tabs/Language Settings\ Settings\C/C++ C/C++\ \FileExtensions valor anterior: cpp;cxx;c;h;hxx;hpp;inl;tlh;tli;rc;rc2 novo valor: cpp;cxx;c;h;hxx;hpp;inl;tlh;tli;rc;rc2;cs

? ?

Copiar ficheiro usertype.dat com keywords do C# para mesma pasta em que se encontra msdev.exe Criar projecto do tipo "makefile" no Visual C++ 6.0 Nos "Settings ..." do projecto, preencher a "Build command line " com algo do tipo:
csc HelloWorld.cs HelloWorld.cs

? ?

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

112

Referncias e Recursos
? ?

Inside C#, Tom Archer, Microsoft Press, 2001 C# Language Specification (http://msdn.microsoft.com/library/default.as p?URL=/library/dotnet/csspec/vclrfcsharpspec_ Start.htm) Start.htm ) A Linguagem de Programao C#, Manuel Costa, Systems Engineer, Internet Business Group, Microsoft (diapositivos ( diapositivos) ) Visual Studio .NET beta 2 .NET Framework SDK beta 2

? ?

Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

Joo Pascoal Faria, FEUP, Setembro de 2001

You might also like