Escolar Documentos
Profissional Documentos
Cultura Documentos
CSharpFEUP10SET2001 PDF
CSharpFEUP10SET2001 PDF
Introduo 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)
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
"Hello, World" em C#
class HelloWorld
{
public static void Main()
{
System.Console.WriteLine("Hello world");
}
}
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))
Introduo ao Framework
Microsoft .NET
A Linguagem C# e o Framework
Microsoft .NET
10
O Framework .NET
Compliant Languages
VB C++
C++ C# JScript
11
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))
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
14
Bibliotecas de Classes
ASP.NET
ADO.NET
Base
Class
Library
15
Objectivos do C#
16
Objectivos do C#
? Orientao a componentes
? Orientao a objectos
? Robustez
? Preservar investimentos
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
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
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
21
Sistema de Tipos
22
23
? 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);
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
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
26
Boxing e Unboxing
? Boxing converso de tipo valor para tipo referncia
? Unboxing converso de tipo referncia para tipo valor
unboxing
// outra forma
int j = o as int;
27
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
29
Classes
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
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
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.
34
Mtodos
Conceitos
? mbito:
? Estticos (partilhados) (static
(static))
? invocados com classe.mtodo
? Overloading
? vrios mtodos com o mesmo nome e diferentes tipos
de parmetros
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
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
39
40
41
42
class Y : X {} // Erro!
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
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
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
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;
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
49
Estruturas, Interfaces,
Enumeraes e Arrays
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
51
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))
53
Interfaces
Exemplo
public delegate void StringListEvent(IStringList sender);
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 {}
55
Interfaces
Implementao explcita *
interface IDataBound
{
void Bind(IDataBinder binder);
}
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
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)
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];
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
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),...
61
Delegados e Eventos
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)
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);
64
Delegados *
Composio e multicasting
class MulticastingApp
{
delegate void IntFunc(int n);
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;
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());}
}
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
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!
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
}
71
Instruo foreach
? foreach (type identifier in expression
expression))
embedded-
embedded-statement
72
Tratamento de Excepes
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()
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{}
76
Sobrecarga (Overloading)
de Operadores
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
78
79
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
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
82
Atributos
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
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
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);
}
}
// ...
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
89
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)
91
92
93
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
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
97
98
Type Library
Importer (do CSILockMngrMetadata.dll
.NET SDK)
99
namespace
classe
100
101
...
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
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
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
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
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
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
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
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
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