Você está na página 1de 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


Microsoft
Intermediate
Language

HelloWorld.cs

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


mandarr 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

Class Libraries

O Framework .NET
VB

C++
C++

C#

JScript

Common Language Specification


ASP.NET: Web Services
And Web Forms

Windows
Windows
forms

ADO.NET: Data and XML


Base Class Library

Studio.NET
Visual Studio.NET

Compliant Languages

10

Common Language Runtime


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

Joo Pascoal Faria, FEUP, Setembro de 2001

Fonte: Manuel Costa, Microsoft Portugal

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.)

Verificao de cdigo
?

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 de cdigo
?

compilao just in time (JIT) de MSIL para cdigo mquina

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


(runtime
hosts)) para aplicaes .NET
hosts

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)
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

Excepes
?

Melhor tratamento de erros

Segurana de tipos (type


(type--safety)
?

Elimina variveis no inicializadas, coero insegura


de tipos, etc.

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

Interoperabilidade
?

Cada vez mais importante

C# fala com XML, SOAP, COM, DLLs


DLLs,, e qualquer
linguagem do .NET Framework

Milhes de linhas de cdigo C# no .NET


?

Pequena curva de aprendizagem

Melhor produtividade

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


(value types)
types)
? Variveis
? No

contm directamente dados/instncias

podem ser null (Nothing em VB)

? Comparao

e atribuio operam com os prprios valores (em C#)

? Manipulao

eficiente porque dados podem ser alocados na stack

Tipos referncia (reference


(reference types)
types)
? Variveis
? Podem

contm referncias para objectos/instncias (no heap


heap))
ser null (Nothing em VB)

? Comparao
? Gesto

e atribuio operam com as referncias (em C#)

automtica de memria (garbage


(garbage collector do CLR)

int i = 123;

string s = "Hello, world";

123

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

Joo Pascoal Faria, FEUP, Setembro de 2001

"Hello, world"

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

Estruturas

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

int i = 1;
1;

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

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

MemoryStream

Hashtable

int

double

...

FileStream

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

int i = 123;
// upcast
object o = i;

boxing

123

heap
System.Int32

o
// downcast explcito
int j = (int)o;
// outra forma
int j = o as int;

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
nomes;
;
using alias = nome
nome-de
de-classe
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:: private (por omisso),
Acessibilidade
omisso), protected
protected,, public
ou internal (mesma unidade de compilao; combinao ou
c/ protected
protected))

: Bases
?

herana de 0 ou 1 uma classe base


?
?

por omisso System.Object


so herdados todos os membros excepto construtores e
destrutores

implementao de 0 ou mais interfaces base

Modificadores
?

Acessibilidade: public, private, protected, internal

...

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


(static)) ou partilhados (VB) alocados uma
vez para toda a classe, para guardar dados partilhados por todas
as instncias

Campo imutvel (readonly


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

podem ser estticos

Podem ter inicializador


?

seno so inicializados com valor por omisso do respectivo tipo

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


(static))
?

invocados com classe.mtodo

De instncia (por omisso)


?

invocados com objecto.mtodo

objecto parmetro implcito (this


(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


(default))

Parmetros referncia de entrada e sada (ref


(ref))
?

obrigatrio passar variveis j inicializadas

Parmetros referncia s de sada (out


(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
object,, i.e., qualquer tipo)

Declara-- se parmetro do tipo array com params


Declara
?

Podem existir parmetros anteriores normais (sem param


param))

Podem--se passar vrios argumentos ou um array


Podem

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
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


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


new))

Podem ser overloaded

No tm valor de retorno (mas no levam void


void))

Podem invocar no inicializador um construtor da classe


base base(...) ou outro construtor da mesma classe
this(...)
this
(...) - por omisso, invocado base()

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

class B : A
{
public B(int x) : base(x)
{ }
}

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

inicializador

44

Construtores Estticos *
?

Cada classe pode ter um construtor esttico (static


(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
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

Ideal para objectos leves


?

int,, float, double,


int
double , etc., so estruturas

complex, point, rectangle, color, ...

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

sp2

5
20

class CPoint { int x, y; ... }


CPoint cp1 = new CPoint(10, 20);
Cpoint cp2 = cp1;
cp2.setX(5);
cp1

CPoint
5

cp2

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

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
?

?
?

implicitamente pblicos e de instncia (no estticos)


pode--se usar new para esconder membro herdado
pode

Herana mltipla:
?

a fornecer por classes ou estruturas que implementam o


interface

um interface pode herdar de mltiplos interfaces


uma classe ou estrutura pode implementar mltiplos interfaces

Nome: habitual comear com letra "I


"I"
Modificadores: acessibilidade e new (em tipos nested
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:
?
?
?

Pode especificarespecificar-se o tipo subjacente (por omisso int


int))
?

comparao: == > < >= <= !=


bit--a-bit: & | ^ ~
bit
outros: + - ++ -- sizeof
byte,, sbyte
byte
sbyte,, short
short,, ushort
ushort,, int
int,, uint
uint,, long ou ulong

Herdam implicitamente de System.Enum


enum Color: byte {
Red
= 1,
Green = 2,
Color c = Color.Red;
Blue = 4,
Black = 0,
White = Red | Green | Blue
}

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:


?

?
?

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:
?

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

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
?

Utilizao
?

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

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

Sub--arrays tm de ser criados um a um


Sub
?

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];

Sub--arrays podem ter tamanhos diferentes


Sub
?

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
?

Criao
?

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

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),...
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);
ou classe derivada

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

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)) definida por um delegado com dois parmetros:
evento
?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


( handlers )

Registar um mtodo que trata o evento:


? evento

+= new delegate
delegate-type
type(
(mtodo
mtodo)
)

Disparar evento: evento


evento(
( obj
obj,
,args
args)
)
? mtodos

registados so invocados sequencialmente


se h subscritores)

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

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
if,, while
while,, for tm de ser do tipo
bool ou de um tipo convertvel explicitamente para
bool (no h converso implcita de int para bool
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
through,, requer "goto
"goto case"
case" ou
"goto default
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


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)

Pode--se relanar excepo com throw sem parmetros


Pode

Pode-se lanar nova excepo que inclui a original


Pode(como inner exception)
exception)

Pode-se definir um bloco finally


Podefinally{}
{} a seguir a try e
catch,, com cdigo que executado em qualquer caso
catch
?

Pode--se ter try


Pode
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_


op_NomeDeOperador
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: +

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

- ! ~ ++ -- true false

Tm de ser public e static


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


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
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()
(){}
{}

Meta--atributo AttributeUsage
Meta
AttributeUsage::
?

Valores possveis de primeiro parmetro: Assembly, Module,


Class,
Class
, All
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:
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 *
?

Pode--se dar um nome local ao mtodo


Pode
?

Pode-se especificar o conjunto de caracteres (Ansi


Pode(Ansi ou
Unicode)
?

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

[DllImport("user32.dll",CharSet=CharSet.ANSI")]
[DllImport("user32.dll",CharSet=CharSet.ANSI"
)]
static extern int MessageBox
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


strings))

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

Compilar com
/unsafe

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
GC,, o que se faz com a
instruo:
?

fixed (type * ptr = expression


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

Importao da type library com TLBIMP


CSILockMngr.tlb

Type Library associada


ao componente COM

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
catch(
COMException e)
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

auto--descritivo e portvel
auto

Mdulo
?

produto intermdio da compilao, com extenso ".netmodule


" .netmodule",
", a
adicionar a um assembly (faz as vezes de um .obj
.obj))

Aplicao
?

constituda por um ou mais assemblies


assemblies,, distribudos individualmente ou
agrupados em ficheiros .CAB ou .msi
.msi

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>.. <minor>
<major>
<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
?

1 - usar Strong Name tool (sn.exe


sn.exe)) para gerar ficheiro
com par de chaves (pblica e privada)
?

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


PublicKeyToken=03689116d3a4ae33

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 assemblie
assembliess 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
ThreadWorker)) que faz o trabalho

mtodos: Start, Sleep, Suspend, Resume,


Interrupt, Abort, ...

propriedades: Priority, ...

Classe AppDomain
?

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

Classe Monitor
?

sincronizao entre threads usando locks e sinais

mtodos: Enter
Enter,, Exit
Exit,, TryEnter
TryEnter,, Wait
Wait,, Pulse
Pulse,, ...

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\\Tabs/Language Settings\
Editor
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

Você também pode gostar