Escolar Documentos
Profissional Documentos
Cultura Documentos
CSharp FEUP10 SET2001
CSharp FEUP10 SET2001
CSharp FEUP10 SET2001
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 *
"Hello, World" em C#
ponto de entrada por omisso de um programa em C#
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
C Sharp Compiler
Windows Portable Executable com com: : - cdigo em MSIL - meta meta- informao - chamada da da funo _CorExeMain de mscoree.dll (do .NET .NET) )
_CorExeMain responsvel por manda mandar r compilar Just In Time o cdigo MSIL (do mtodo Main Main) ) para cdigo mquina, mquina, e mandar executar o cdigo mquina Tambm possvel compilar o cdigo MSIL no momento da instalao
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
IL_0000: ldstr "Hello, World" IL_0005: call void ['mscorlib']System.Console.WriteLine(class System.String) IL_000a: ret } // end of method 'Hello:Main'
Assembly
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#
10
Compliant Languages
O Framework .NET
VB C++ C++ C# JScript Studio.NET Visual Studio.NET
Common Language Specification ASP.NET: Web Services And Web Forms Windows Windows forms
Class Libraries
ADO.NET: Data and XML Base Class Library Common Language Runtime Runtime
11
O CLR faz a gesto em tempo de execuo do cdigo conforme com o Framework .NET
? ? ?
Gesto automtica de memria (garbage collector - GC) Gesto de threads Gesto de segurana
?
controlo de acesso a recursos sensveis (ficheiros, rede, etc.) conformidade com o CTS (Common (Common Type System) System) type safety cdigo acede apenas a localizaes de memria a que est autorizado a aceder (se verificao falhar, lana excepo) compilao just in time (JIT) de MSIL para cdigo mquina
Verificao de cdigo
? ?
Compilao de cdigo
?
12
O .NET Framework inclui diversos programas hospedeiros (runtime hosts ) para aplicaes .NET Um programa hospedeiro um componente no gerido que carrega o CLR para o seu processo e inicia a execuo de cdigo gerido Programas hospedeiros:
?
ASP.NET carrega o runtime para o processo que ir tratar o pedido Web; cria um domnio aplicacional (processo lgico gerido pelo CLR) CLR) para cada aplicao Web que ir correr num servidor Web Internet Explorer cria domnios aplicacionais (por defeito, um para cada Web site) para correr controlos Windows Forms embebidos em documentos HTML; comunicao entre CLR e IE atravs de filtros M IME Executveis shell controlo transferido para cdigo de hospedagem cada vez que um executvel lanado pela shell (ver HelloWorld HelloWorld) )
13
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
15
Objectivos do C#
16
Objectivos do C#
? ? ? ?
17
Orientao a Componentes *
?
Apresentada como primeira linguagem Orientada por Componentes da famlia C/C++ Consideraes de evoluo de verses pensadas na linguagem Componentes autoauto -descritivos
?
Metadados, incluindo atributos definidos pelo utilizador, consultados em tempo de execuo atravs de reflexo Documentao integrada em XML
? ?
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
19
Robustez *
?
Elimina problemas com fugas de memria e apontadores invlidos Mas quem quiser pode trabalhar directamente com apontadores Melhor tratamento de erros Elimina variveis no inicializadas, coero insegura de tipos, etc.
Excepes
?
20
Preservar Investimentos *
?
Espaos de nomes, apontadores (em cdigo unsafe unsafe), ), etc. Nenhum sacrifcio desnecessrio Cada vez mais importante C# fala com XML, SOAP, COM, DLLs DLLs, , e qualquer linguagem do .NET Framework Pequena curva de aprendizagem Melhor produtividade
Interoperabilidade
? ?
21
Sistema de Tipos
22
? Comparao ? Manipulao
? Comparao ? Gesto
i s
23
Tipos Valor
? ? ?
int i; (de facto tambm so estruturas!) estruturas !) enum State { Off, On } struct Point { int x, y; }
Tipos Referncia
? ? ? ?
string[] a = new string[10]; class Foo Foo: : Bar, IFoo {...} interface IFoo IFoo: : IBar {...} delegate double MathFunc MathFunc(double (double x);
24
Tipos Pr -definidos em C#
Classes CTS Type Name System.Object System.String System.SByte System.Byte System.Int16 System.UInt16 System.Int32 System.UInt32 System.Int64 System.UInt64 System.Char System.Single System.Double System.Boolean System.Decimal C# Alias object string sbyte byte short ushort int uint long ulong char float double bool decimal Description Base class for all CTS types String Signed 8-bit byte Unsigned 8-bit byte Signed 16-bit value Unsigned 16-bit value Signed 32-bit value Unsigned 32-bit value Signed 64-bit value Unsigned 64-bit value 16-bit Unicode character IEEE 32-bit float IEEE 64-bit float Boolean value (true/false) 128-bit data type exact to 28 or 29 digits mainly used for financial applications
Estruturas
int i = 1; 1;
25
Tudo um Objecto
?
Todos os tipos (mesmo tipos valor) derivam de object e podem ser tratados como objectos Concilia eficincia com simplicidade
? ?
instncias de tipos valor so guardadas na stack no h wrapper classes com em Java (graas a mecanismo de boxing e unboxing ver a seguir) coleces funcionam com todos os tipos object
string
Stream
Hashtable FileStream
int
double
MemoryStream
...
26
Boxing e Unboxing
? ?
Boxing converso de tipo valor para tipo referncia Unboxing converso de tipo referncia para tipo valor
stack i o 123
int i = 123; // upcast object o = i; // downcast explcito int j = (int)o; // outra forma int j = o as int;
boxing
heap
System.Int32
123
123
unboxing
27
Programa constitudo por declaraes de tipos (classes, interfaces, interfaces, estruturas, etc.) dentro de espaos de nomes
?
? ? ?
? ?
Um espao de nomes pode conter tipos (classes, estruturas, etc.) e outros espaos de nomes Tipos declarados fora de qualquer espao de nomes ficam num espao de nomes global Vrios ficheiros de cdigo fonte podem contribuir para o mesmo espao de nomes, mas cada tipo tem de ser definido num nico ficheiro Para minimizar conflitos, aconselhvel usar o nome da empresa seguido do produto ou projecto (exemplo: Novabase.CSI.LockMngr Novabase.CSI.LockMngr) ) Instrues:
? ? ?
using nome nome-de de- espao espao-de de-nomes; using alias = nome nome-de de-classe; namespace nome nome-de de-espao espao-de de-nomes { declaraesdeclaraes- de de-tipos tipos-e-espaos espaos-de de-nomes }
28
Espaos de Nomes
Exemplo *
namespace N1 // nome completo: { class C1 // nome completo: { class C2 // nome completo: { } } namespace N2 // nome completo: { class C2 // nome completo: { } } } namespace N1.N2 { class C3 // N1.N2.C3 { } } N1 N1.C1 N1.C1.C2
N1.N2 N1.N2.C2 using using MyC2 MyC2 = = N1.N2.C2; N1.N2.C2; using using N1; N1; class myClass class myClass { { C1 C1 c1; c1; // // N1.C1 N1.C1 MyC2 MyC2 c2; c2; // // N1.N2.C2 N1.N2.C2 } }
29
Classes
30
Classes
?
{ Membros }
? ? ?
Campos, mtodos, constantes, propriedades, indexadores, operadores, construtores, destrutores, eventos, tipos nested mbito: estticos (partilhados) ou de instncia Acessibilidade: Acessibilidade : private (por omisso), omisso), protected, public ou internal (mesma unidade de compilao; combinao ou c/ protected) herana de 0 ou 1 uma classe base
? ?
: Bases
?
implementao de 0 ou mais interfaces base Acessibilidade: public, private, protected, internal ...
Modificadores
? ?
31
Campos (fields)
Conceitos
? ?
campos de instncia alocados em cada instncia da classe, para guardar dados da instncia campos estticos (static) ou partilhados (VB) alocados uma vez para toda a classe, para guardar dados partilhados por todas as instncias
Campo imutvel (readonly) guarda valor imutvel definido pelo construtor (ou inicializador) no momento da execuo
?
podem ser estticos seno so inicializados com valor por omisso do respectivo tipo
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)); } }
34
Mtodos
Conceitos
?
mbito:
?
Overloading
?
35
Mtodos
Tipos de Parmetros
? ?
class Calculator { private double mem; public void Store(double x) { mem = x; } public void Load(out Load(out double x) { x = mem; } public void Exchange(ref Exchange(ref double x) { double old_mem = mem; mem = x; x = old_mem;} }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
36
Mtodos
Argumentos Variveis *
?
Mtodos podem aceitar um n varivel de argumentos do mesmo tipo (no limite object , i.e., qualquer tipo) DeclaraDeclara - se parmetro do tipo array com params
? ?
Podem existir parmetros anteriores normais (sem param) PodemPodem -se passar vrios argumentos ou um array
class VarArgsApp { public static double Sum(params double[] nums) { double sum = 0; foreach (double x in nums) sum += x; return sum; } public static void Main() { System.Console.WriteLine(Sum(1.0, 2.0, 3.0)); } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
37
Herana e "Substitutabilidade"
using System;
Herda implicitamente de System.Object
class C2: C1 { public void F2() {Console.WriteLine("F2");} } class C3: C2 { public void F3() {Console.WriteLine("F3");} }
class InheritanceApp { public static void Main(){ C1 c1 = new C1(); C2 c2 = new C2(); C3 c3 = new C3(); // herana c2.F1(); c3.F1(); c3.F2(); // substitutabilidade c2 = c3 c3; c1 = c2 c2; c1 = c3; }
Onde se espera um objecto da classe base (C1) podepode-se passar um objecto de uma classe derivada (C3)
38
Upcast e Downcast *
?
Upcast converso de classe derivada para classe base (ao nvel de referncias)
? ?
Downcast converso de classe base para classe derivada (ao nvel de referncias)
? ?
Tem de se fazer um cast explcito com (type type) ) ou as type S possvel se objecto referenciado for da classe derivada (ou de uma terceira classe derivada desta)
?
Se assim no for,
? ?
"(type "( type) )objref " d excepo System. System.InvalidCastException InvalidCastException " objref as type type" " d null
39
class PolymorphismApp { o problema da classe base frgil public static void Main(){ B b = new B(); A a = b; mtodo chamado depende do tipo do objecto a.F(); // B.F referenciado (determinado em tempo de execuo late binding) e no do tipo da varivel que b.F(); // B.F guarda a referncia (determinado em tempo de } compilao early binding) }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
40
Modificador new usado na definio de um novo membro (mtodo, tipo nested, etc.) que esconde um membro herdado com o mesmo nome (e assinatura, no caso
de mtodos e similares)
?
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
41
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)
? ?
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
43
Construtores de Instncia
?
So mtodos com mesmo nome da classe, usados para inicializar novas instncias da classe Podem ter parmetros (passados a new) Podem ser overloaded No tm valor de retorno (mas no levam void ) Podem invocar no inicializador um construtor da classe base base(...) ou outro construtor da mesma classe this(...) this (...) - por omisso, invocado base()
class B : A { public B(int x) : base(x) { } } inicializador
? ? ? ?
44
Construtores Estticos *
?
Cada classe pode ter um construtor esttico (static) para inicializar a classe (normalmente inicializar campos estticos) Construtor esttico no tem tipo de retorno nem parmetros
45
Destrutores *
?
So mtodos com nome da classe precedido de "~", usados para "destruir" um objecto que vai ser libertado de memria
? ?
So chamados pelo garbage collector Um objecto pode ser libertado de memria a partir do momento em que no pode ser usado por nenhuma parte do cdigo
Destrutores no tm parmetros nem valor de retorno (mas no levam void) Correspondem a mtodo Finalize no CLR, implementado desde System System. .Object
46
Constantes
?
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
?
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;
48
Indexadores (indexers)
?
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
50
Estruturas
?
Sem herana (mas herdam implicitamente de object e podem implementar interfaces) Sem destrutores Campos de instncia no podem ter inicializadores int, int , float, double, double , etc., so estruturas complex, point, rectangle, color, ...
? ?
51
sp2
CPoint
52
Interfaces
? ?
Um interface define um contracto ao qual tem de aderir qualquer classe ou estrutura que o implemente Membros: mtodos, propriedades, eventos e indexadores
?
sem implementao
?
? ?
implicitamente pblicos e de instncia (no estticos) podepode -se usar new para esconder membro herdado
um interface pode herdar de mltiplos interfaces uma classe ou estrutura pode implementar mltiplos interfaces
Herana mltipla:
? ?
? ?
Nome: habitual comear com letra "I" Modificadores: acessibilidade e new (em tipos nested)
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{...} } }
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) { ... } }
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
56
Enumeraes
? ? ?
Definem conjuntos de constantes simblicas Converso de/para inteiro, mas s explcita Operadores aplicveis:
? ? ?
comparao: == > < >= <= != bitbit -a-bit: & | ^ ~ outros: + - ++ -- sizeof byte, sbyte, short, ushort, int, uint, long ou ulong enum Color: byte { Red = 1, Green = 2, Color c = Color.Red; Blue = 4, Black = 0, White = Red | Green | Blue }
? ?
57
Arrays uni-dimensionais
?
Criao (alocao):
? ?
a = new int[4]; // cria array de 4 inteiros Tamanho determinado ao criar (em tempo de execuo)
? ?
ndices so inteiros e comeam em 0 Inicializados com valores por omisso do respectivo tipo, ou com valores (constantes) dados explicitamente:
?
new int[] {1, 2, 3}; ou: new int[3] {1, {1, 2, 3}; 3};
Converso entre arrays do tipo A[] e B[] realizarealiza-se nas mesmas condies que converso entre tipos A e B
?
58
Arrays de Arrays *
?
Declarao
?
Utilizao
?
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];
int[][] matrizTriang = new int[10]; for (int i = 0; i < 10; i++) matrizTriang[i] = new int[i+1];
59
Arrays multi-dimensionais *
?
Declarao
?
Criao
?
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
?
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),...
61
Delegados e Eventos
62
Delegados (Delegates)
?
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); // 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
65
Eventos
Definir e disparar
// tipo de delegado que define a assinatura do evento public delegate void EventHandler(object sender, EventArgs e); public class Button { // campo que define o evento e memoriza handlers public event EventHandler Click; // mtodo que dispara o evento // (normalmente escondido de clientes) protected void OnClick(EventArgs e) { if (Click != null) Click(this, e); // dispara aqui } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
ou classe derivada
66
Eventos
Registar handler e tratar
using System.Windows.Forms; public class MyForm: Form { Button okButton; public MyForm() { okButton = new Button(); regista handler okButton.Text = "OK"; okButton.Click += new EventHandler(OkButtonClick); Controls.Add(okButton); trata evento Show(); } void OkButtonClick(object sender, EventArgs e) { MessageBox.Show("You pressed the OK button"); } public static void Main(string[] args) {Application.Run(new MyForm());} }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
67
Eventos
Detalhes *
?
A assinatura do evento (ou melhor, dos mtodos que tratam o evento) evento ) definida por um delegado com dois parmetros:
?o
objecto que disparou o evento ? um objecto da classe System System. .EventArgs ou classe derivada, com informao sobre o evento
?
campo guarda a lista de mtodos que tratam o evento ( handlers ) += new delegate delegate-type(mtodo)
? previamente testa testa-se se no (i.e., Inroduo Linguagem de Programao C#, Joo Pascoal Faria, FEUP, 10 null de Setembro de 2001
68
Operadores e Instrues
69
Operadores e Instrues
?
So basicamente os mesmos do C/C++, com alguns melhoramentos para evitar erros comuns
?
Condies em if, while, for tm de ser do tipo bool ou de um tipo convertvel explicitamente para bool (no h converso implcita de int para bool)
int i = 1; 1; if (i) ... // Errado! if (i != 0) .... // Certo!
70
Instruo switch *
? No
71
Instruo foreach
?
72
Tratamento de Excepes
73
Tratamento de Excepes
Lanar excepo
?
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
?
class FraccaoApp { public static void Main() { try { Fraccao f = new Fraccao(1,0); } catch(Exception e) apanha excepes desta classe ou de { classes derivadas Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } } }
denominador=0! at Fraccao..ctor(Int32 numerador, Int32 denominador) at FraccaoApp.Main()
75
Tratamento de Excepes
Outras features *
?
Podem-se ter vrios blocos catch seguidos, para Podemapanhar excepes de diferentes classes
?
blocos mais "especializados" devem estar depois de blocos de mais "genricos" (seno nunca so executados)
? ?
PodePode -se relanar excepo com throw sem parmetros Pode-se lanar nova excepo que inclui a original Pode(como inner exception) Pode-se definir um bloco finally {} a seguir a try e Podecatch, com cdigo que executado em qualquer caso
?
76
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
?
? ?
78
79
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
unrios: +
- ! ~ ++ -- true false
? ?
Tm de ser public e static , c/ parmetros por valor Pelo menos um dos parmetros tem de ser da classe ou estrutura em que o operador declarado
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 palavrapalavra- chave operator
? ?
Tm de ser public e static , c/ parmetros por valor No se podem redefinir converses prpr -definidas
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 )
? ? ?
URL de documentao para uma classe Nome de um campo em XML Propriedades transaccionais de um mtodo, etc.
Vantagens: informao mais integrada e consistente, dispensa ficheiros externos (.IDL, .DEF, etc.), componentes autoauto-descritivos Valores de atributos indicados entre [ ] antes dos elementos a que que se referem (entre < > em VB) Tipos de atributos so classes derivadas de System.Attribute Consultados em tempo de execuo atravs de reflexo Usados intensivamente por muitos servios do .NET (XML, COM,...)
? ? ?
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" automaticamente acrescentado ao nome Parmetros obrigatrios (parmetros do construtor) primeiro, pela ordem definida Parmetros opcionais (propriedades ou campos pblicos) depois, com nome=valor
[Developer("Joao Pascoal Faria", Reviewed = true)] class DemoApp { [Developer("JPF")] public static void Main() { QueryDevelopers.QueryType(typeof(DemoApp)); } } Operador do C#, devolve
instncia de System.Type
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
86
Atributos
Consulta
using System; using System.Reflection; class QueryDevelopers { public static void QueryType(Type t) { Console.WriteLine("Type: {0}", t.FullName); QueryMember(t); foreach (MethodInfo m in t.GetMethods t.GetMethods()) ()) { Console.WriteLine("Method: {0}", m.Name); QueryMember(m); } } // ...
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
87
Atributos
Consulta (cont.)
// ... private static void QueryMember(MemberInfo m) { foreach(Attribute a in m.GetCustomAttributes m.GetCustomAttributes(false)) (false)) { if (a is DeveloperAttribute) { DeveloperAttribute d = (DeveloperAttribute)a; Console.WriteLine("Developer: {0}", d.Name); Console.WriteLine("Reviewed : {0}", d.Reviewed); } } ... ... Type: DemoApp DemoApp } Type: Method: Developer: Joao Pascoal Faria Method: ToString ToString } Developer: Joao Pascoal Faria Method: Main Reviewed : True Method: Main Reviewed : True Developer: JPF Method: GetHashCode Developer: JPF Method: GetHashCode Reviewed : False Method: Equals Reviewed : False Method: Equals Method: GetType ... Method: GetType ...
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
88
Atributos *
Outras features
?
Quando atributo no tem parmetros, dispensamdispensam-se parntesis Para resolver ambiguidade acerca do elemento a que se refere um atributo, podepode-se usar um prefixo como em
?
Valores possveis de primeiro parmetro: Assembly, Module, Class, Class , All, etc. Tem dois parmetros opcionais:
?
AllowMultiple se pode ser definido vrias vezes para mesmo elemento Inherited se atributo herdado (por classes derivadas, etc.)
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:
? ? ?
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
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
93
Pode-se especificar a forma como feito o marshaling de Podecada parmetro e do valor de retorno
?
[DllImport("user32.dll", CharSet=CharSet.Unicode)] static extern int MessageBox(int hWnd, [MarshalAs(UnmanagedType.LPWStr)] string msg, [MarshalAs(UnmanagedType.LPWStr)] string caption, int type); Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
94
Cdigo unsafe *
Apontadores
?
possvel trabalhar com apontadores para tipos valor, strings e arrays de tipos valor dentro de cdigo (mtodo ou bloco) marcado com unsafe Operadores como em C/C++:
? ? ? ?
& * ->
95
Cdigo unsafe *
Alocao de arrays na stack
?
96
Cdigo unsafe *
Apontadores para objectos geridos
?
Para usar endereo de componente de objecto gerido pelo garbage collector (GC) (GC), , necessrio garantir que o mesmo no movido pelo GC, o que se faz com a instruo:
?
class FixedApp { class A {public int x;} Objecto "a" no public unsafe static void Main() movido durante a { execuo da instruo A a = new A(); fixed(int fixed (int *p = &a &a.x) *p = 1; System.Console.WriteLine("a. System.Console.WriteLine(" a.x={0}", x={0}",a a.x); } }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
97
98
CSILockMngrMetadata.dll
Metadata wrapper, com informao que o .NET runtime pode compreender
99
100
101
102
Outros Tpicos
103
Documentao em XML
?
Compilador gera automaticamente documentao a partir do cdigo fonte, utilizando os comentrios XML (///)
?
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 DEBUG using System; using System.Diagnostics; // tem ConditionalAttribute public class Trace { [Conditional("DEBUG")] public static void Msg(string msg) {Console.WriteLine(msg);} Mtodo e chamadas no so compilados } se #define DEBUG for retirado class Test { public static void Main() {Trace.Msg("Now in Main."); Console.WriteLine("Done.");} }
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
105
Assemblies
Conceitos
?
Assembly
?
empacotamento num ficheiro fsico (.dll (.dll ou .exe .exe) ) de um manifesto, cdigo MSIL de um ou mais tipos (classes, interfaces, etc.), e zero ou mais recursos (bitmaps, JPEGs JPEGs , etc. etc.) ) unidade fundamental de construo, deployment deployment, , controlo de verses e controlo de segurana no framework .NET autoauto -descritivo e portvel
produto intermdio da compilao, com extenso ".netmodule " .netmodule", ", a adicionar a um assembly (faz as vezes de um .obj .obj) ) constituda por um ou mais assemblies , distribudos individualmente ou agrupados em ficheiros .CAB ou .msi .msi
? ?
Mdulo
?
Aplicao
?
106
Assemblies
Controlo de verses
? ? ? ?
N de verso composto por 4 segmentos: <major>. <major> . <minor> <minor>. . <build> <build>. .<revision> N de verso definido no cdigo fonte com atributo [assembly:AssemblyVersion("1 [assembly:AssemblyVersion(" 1.1.0.0")] O manifesto de um assembly contm o n de verso e a lista de assemblies referenciados e respectivas verses Poltica de verses por defeito: usar verso com n mais alto que coincide nos 2 primeiros segmentos (para cada
assembly referenciado)
? ?
se no for encontrado, lanada excepo outras polticas indicadas em ficheiro de configurao em XML
S so controlados assemblies com nomes fortes, registados na global assembly cache (com gacutil i assembly )
107
Assemblies
Nomes fortes (partilhados)
? ?
Usados para controlo de verses e segurana Nome forte consiste da identidade do assembly nome simples textual, n de verso e informao sobre cultura (se fornecida) reforado com uma chave pblica e uma assinatura digital
?
1 - usar Strong Name tool (sn.exe sn.exe) ) para gerar ficheiro com par de chaves (pblica e privada)
?
sn k Teste.key
[assembly:AssemblyKeyFile("Teste.key")]
3 - compilador coloca automaticamente no manifesto as chaves pblicas dos assemblies referenciados Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
?
108
Reflexo
?
Possibilidade de consultar metameta-informao em tempo de execuo e mesmo criar novos tipos e gerar ("emitir") e executar cdigo MSIL Essencial para o .NET . NET runtime J visto anteriormente
? ?
? ?
consulta de atributos instanciao de objectos e invocao de mtodos com late binding (por nome)
109
Multithreading *
?
Classe Thread
? ? ?
instanciada com referncia para mtodo (com assinatura cf. delegado ThreadWorker ) que faz o trabalho mtodos: Start, Sleep, Suspend, Resume, Interrupt, Abort, ... propriedades: Priority, ... ambiente isolado para a execuo dos vrios threads de uma aplicao um processo lgico dentro de um processo fsico de um runtime host ASP.NET, IE ou shell sincronizao entre threads usando locks e sinais mtodos: Enter, Exit, TryEnter, Wait, Pulse, ...
Classe AppDomain
? ?
Classe Monitor
? ?
110
Mais Informao
111
C# no Visual Studio 6
? ?
chave: HKEY_CURRENT_USER\ HKEY_CURRENT_USER \Software Software\ \Microsoft Microsoft\ \DevStudio DevStudio\ \6.0 6.0\ \Text Editor\ Editor \Tabs/Language Settings\ Settings\C/C++ C/C++\ \FileExtensions valor anterior: cpp;cxx;c;h;hxx;hpp;inl;tlh;tli;rc;rc2 novo valor: cpp;cxx;c;h;hxx;hpp;inl;tlh;tli;rc;rc2;cs
? ?
Copiar ficheiro usertype.dat com keywords do C# para mesma pasta em que se encontra msdev.exe Criar projecto do tipo "makefile" no Visual C++ 6.0 Nos "Settings ..." do projecto, preencher a "Build command line " com algo do tipo:
csc HelloWorld.cs HelloWorld.cs
? ?
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
? ?