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


HelloWorld.cs Microsoft
Intermediate
Language

C Sharp csc HelloWorl


HelloWorld.cs
Compiler

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 11 (0xb)
.maxstack 8
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 Assembly tipo de parmetro


para a stack 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

O Framework .NET
Compliant Languages

VB C++
C++ C# JScript

Common Language Specification


Visual Studio.NET

ASP.NET: Web Services Windows


Windows
Class Libraries

And Web Forms forms


Studio.NET

ADO.NET: Data and XML

Base Class Library

Common Language Runtime


Runtime
Fonte: Manuel Costa, Microsoft Portugal
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#

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 auto-
auto -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 contm directamente dados/instncias
? No 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 contm referncias para objectos/instncias (no heap
heap))
? Podem ser null (Nothing em VB)
? Comparao e atribuio operam com as referncias (em C#)
? Gesto automtica de memria (garbage
(garbage collector do CLR)

int i = 123; i 123

string s = "Hello, world"; s "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 int i; (de facto tambm so estruturas!)
estruturas !)
? Enumeraes enum State { Off, On }
? Estruturas struct Point { int x, y; }

? Tipos Referncia
? Arrays string[] a = new string[10];
? Classes class Foo
Foo:: Bar, IFoo {...}
? Interfaces interface IFoo
IFoo:: IBar {...}
? Delegados 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#
CTS Type Name C# Alias Description
System.Object object Base class for all CTS types
Classes
System.String string String
System.SByte sbyte Signed 8-bit byte
System.Byte byte Unsigned 8-bit byte
System.Int16 short Signed 16-bit value
System.UInt16 ushort Unsigned 16-bit value
System.Int32 int Signed 32-bit value
System.UInt32 uint Unsigned 32-bit value
Estruturas System.Int64 long Signed 64-bit value
System.UInt64 ulong Unsigned 64-bit value
System.Char char 16-bit Unicode character
System.Single float IEEE 32-bit float
System.Double double IEEE 64-bit float
System.Boolean bool Boolean value (true/false)
System.Decimal decimal 128-bit data type exact to 28
or 29 digits mainly used for
financial applications
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 int double

MemoryStream 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

int i = 123; stack


boxing
// upcast i 123 heap
object o = i;
o System.Int32
// downcast explcito 123
int j = (int)o; j 123

unboxing
// outra forma
int j = o as int;

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
{ declaraes-
declaraes- 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: N1
{
class C1 // nome completo: N1.C1
{
class C2 // nome completo: N1.C1.C2
{ }
}
namespace N2 // nome completo: N1.N2
{
class C2 // nome completo: N1.N2.C2
{ }
} using
using MyC2
MyC2 == N1.N2.C2;
N1.N2.C2;
} using
using N1;
N1;
class myClass
class myClass
namespace N1.N2 {{
{ C1
C1 c1;
c1; // // N1.C1
N1.C1
class C3 // N1.N2.C3 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 nmero=1
nmero=1 data=23-
data=23 -07
07--2001
data=23-07-2001 valor=10.000$00
valor=10.000$00 Esc.
Esc.
Factura
Factura nmero=2
nmero=2 data=23
data=23-- 07-
07 -2001
data=23-07-2001 valor=20.000$00
valor=20.000$00 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; class InheritanceApp {
Herda implicitamente public static
de System.Object void Main(){
class C1 { C1 c1 = new C1();
public void F1() C2 c2 = new C2();
{Console.WriteLine("F1");} C3 c3 = new C3();
} // herana
Herda membrosde c2.F1();
C1 e acrescenta F2 c3.F1();
class C2: C1 { c3.F2();
public void F2() // substitutabilidade
{Console.WriteLine("F2");} c2 = c3
c3;
} c1 = c2
c2;
c1 = c3;
}
class C3: C2 {
public void F3()
{Console.WriteLine("F3");} Onde se espera um objecto da
} classe base (C1) pode-
pode-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
"( )objref " d excepo System.
type) 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
b.F(); // B.F late binding) e no do tipo da varivel que
} 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
(...) - por omisso, invocado base()
this(...)
this
class A
{ class B : A
private int x; {
public A(int x) public B(int x) : base(x)
{ this.x = 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 tipos-
tipos-valor em vez de tipos-
tipos-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; ... } 10
SPoint sp1 = new SPoint(10, 20); sp1
20
Spoint sp2 = sp1;
sp2.setX(5);
5
sp2
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
? a fornecer por classes ou estruturas que implementam o
interface
? implicitamente pblicos e de instncia (no estticos)
? pode--se usar new para esconder membro herdado
pode
? Herana mltipla:
? 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:
? comparao: == > < >= <= !=
? bit--a-bit: & | ^ ~
bit
? outros: + - ++ -- sizeof
? Pode especificar-
especificar-se o tipo subjacente (por omisso int
int))
? byte,, sbyte
byte sbyte,, short
short,, ushort int,, uint
ushort,, int 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:
? int[] a; // array uni-
uni- 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[] realiza-


realiza-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
//array uni-- dimensional de elem'
elem's do tipo int[]

? Utilizao
? 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
? m; //
int[,] m; //array
array bi-
bi-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),...
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);
Show(); trata evento
}
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 palavra-
palavra-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
? previamente
Inroduo Linguagem testa
testa-
de Programao C#, -se se
Joo Pascoal no
Faria,FEUP, de Setembro(i.e.,
se h subscritores)
10 null 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))
embedded-
embedded-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
Console.WriteLine(e.Message); classes derivadas
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
Podem-
apanhar 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
Pode- {} a seguir a try e
finally{}
catch,, com cdigo que executado em qualquer caso
catch
? Pode--se ter try
Pode try{}
{} finally {} sem catch
finally{}

? 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: + - ! ~ ++ -- true false
? binrios: + - * / % & | ^ << >> == != > < >= <=

? 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 palavra-
palavra- 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 pr-
pr -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 auto-
auto-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" Parmetros obrigatrios Parmetros opcionais
automaticamente (parmetros do (propriedades ou campos
acrescentado ao construtor) primeiro, pblicos) depois, com
nome pela ordem definida 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:Type: DemoApp
DemoApp ...
} Developer: Joao Pascoal Faria
Developer: Joao Pascoal Faria Method:
Method: ToString
ToString
Reviewed : True
Reviewed : True Method:
Method: Main
Main
Method: GetHashCode
Method: GetHashCode Developer:
Developer: JPF
JPF
Method: Equals
Method: Equals Reviewed
Reviewed :: False
False
...
... Method:
Method: GetType
GetType
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

88

Atributos *
Outras features
? Quando atributo no tem parmetros, dispensam-
dispensam-se
parntesis
? Para resolver ambiguidade acerca do elemento a que se
refere um atributo, pode-
pode-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,, etc.
, All
? 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
? [DllImport("user32.dll",EntryPoint="MessageBoxA")]
[DllImport("user32.dll",EntryPoint="MessageBoxA" )]
static extern int MsgBox
MsgBox(( ....);

? Pode-se especificar o conjunto de caracteres (Ansi


Pode- (Ansi ou
Unicode)
? [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


Pode-
cada 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() { Compilar com
int a = 1; int *aPtr = &a; *aPtr = 2; /unsafe
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 GCGC,, 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}",aa.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

Type Library associada


CSILockMngr.tlb ao componente COM

TLBIMP CSILockMngr.tlb /out:CSILockMngrMetadata.dll

Type Library
Importer (do CSILockMngrMetadata.dll
.NET SDK)

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
class Test { se #define DEBUG for retirado
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
? 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 assemblie assembliess referenciados
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001

108

Reflexo
? Possibilidade de consultar meta-
meta-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.
ThreadWorker)) que faz o trabalho
delegado ThreadWorker
? 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