Escolar Documentos
Profissional Documentos
Cultura Documentos
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
?
Enfatizar novidades
ndice
?
Objectivos do C#
Sistema de tipos
Classes
Operadores e instrues
Tratamento de excepes
Sobrecarga de operadores
"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
HelloWorld.cs
C Sharp
Compiler
csc HelloWorl
HelloWorld.cs
HelloWorl
HelloWor
ld.exe
11 (0xb)
carrega string
para a stack
Assembly
tipo de parmetro
a retirar da stack
Introduo ao Framework
Microsoft .NET
A Linguagem C# e o Framework
Microsoft .NET
?
Class Libraries
O Framework .NET
VB
C++
C++
C#
JScript
Windows
Windows
forms
Studio.NET
Visual Studio.NET
Compliant Languages
10
11
Gesto de threads
Gesto de segurana
?
Verificao de cdigo
?
Compilao de cdigo
?
12
Programas Hospedeiros
(runtime hosts)
?
Programas hospedeiros:
?
13
Common Language
Specification (CLS)
?
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 *
?
Programao simples
?
18
Orientao a Objectos *
?
Tudo um objecto
No tem templates
19
Robustez *
?
Excepes
?
20
Preservar Investimentos *
?
Interoperabilidade
?
Melhor produtividade
21
Sistema de Tipos
22
? Comparao
? Manipulao
? Comparao
? Gesto
int i = 123;
123
"Hello, world"
23
Tipos Valor
?
?
?
Primitivos
Enumeraes
Estruturas
Tipos Referncia
?
?
?
?
Arrays
Classes
Interfaces
Delegados
24
Tipos Pr -definidos em C#
Classes
Estruturas
int i = 1;
1;
C# Alias
object
string
sbyte
byte
short
ushort
int
uint
long
ulong
char
float
double
bool
decimal
Description
Base class for all CTS types
String
Signed 8-bit byte
Unsigned 8-bit byte
Signed 16-bit value
Unsigned 16-bit value
Signed 32-bit value
Unsigned 32-bit value
Signed 64-bit value
Unsigned 64-bit value
16-bit Unicode character
IEEE 32-bit float
IEEE 64-bit float
Boolean value (true/false)
128-bit data type exact to 28
or 29 digits mainly used for
financial applications
25
Tudo um Objecto
?
string
Stream
MemoryStream
Hashtable
int
double
...
FileStream
26
Boxing e Unboxing
?
int i = 123;
// upcast
object o = i;
boxing
123
heap
System.Int32
o
// downcast explcito
int j = (int)o;
// outra forma
int j = o as int;
123
123
unboxing
27
?
?
?
?
?
using nome
nome-de
de- espao
espao-de
de-nomes
nomes;
;
using alias = nome
nome-de
de-classe
classe;
;
namespace nome
nome-de
de-espao
espao-de
de-nomes
{ declaraesdeclaraes- de
de-tipos
tipos-e-espaos
espaos-de
de-nomes }
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 }
?
: Bases
?
Modificadores
?
...
31
Campos (fields)
Conceitos
?
Guardam dados
mbito:
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
Factura
Factura
nmero=1
nmero=1
nmero=2
nmero=2
data=23data=23
-07
07-2001
data=23-07-2001
data=23
data=230707
-2001
data=23-07-2001
valor=10.000$00
valor=10.000$00
valor=20.000$00
valor=20.000$00
Esc.
Esc.
Esc.
Esc.
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 *
?
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 C1 {
public void F1()
{Console.WriteLine("F1");}
}
Herda membrosde
C1 e acrescenta F2
class C2: C1 {
public void F2()
{Console.WriteLine("F2");}
}
class C3: C2 {
public void F3()
{Console.WriteLine("F3");}
}
class InheritanceApp {
public static
void Main(){
C1 c1 = new C1();
C2 c2 = new C2();
C3 c3 = new C3();
// herana
c2.F1();
c3.F1();
c3.F2();
// substitutabilidade
c2 = c3
c3;
c1 = c2
c2;
c1 = c3;
}
Onde se espera um objecto da
classe base (C1) podepode-se passar um
objecto de uma classe derivada (C3)
38
Upcast e Downcast *
?
Se assim no for,
?
"(type
"(
type)
)objref " d excepo System.
System.InvalidCastException
InvalidCastException
39
class A {
public virtual void F() {Console.WriteLine("A.F");}
}
substitui implementao de mtodo virtual
herdado, para objectos da classe derivada
class B: A {
public override void F() {Console.WriteLine("B.F");}
}
Utilizao explcita de override reduz
class PolymorphismApp {
o problema da classe base frgil
public static void Main(){
B b = new B();
A a = b;
mtodo chamado depende do tipo do objecto
a.F(); // B.F
referenciado (determinado em tempo de execuo
late binding) e no do tipo da varivel que
b.F(); // B.F
guarda a referncia (determinado em tempo de
}
compilao early binding)
}
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
40
41
42
43
Construtores de Instncia
?
class A
{
private int x;
public A(int x)
{ this.x = x; }
}
class B : A
{
public B(int x) : base(x)
{ }
}
inicializador
44
Construtores Estticos *
?
45
Destrutores *
?
46
Constantes
?
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
?
?
?
48
Indexadores (indexers)
?
So smart
smart arrays
arrays
?
?
?
?
?
49
Estruturas, Interfaces,
Enumeraes e Arrays
50
Estruturas
?
Sem destrutores
51
sp1
10
20
sp2
5
20
CPoint
5
cp2
20
Inroduo Linguagem de Programao C#, Joo Pascoal Faria,FEUP, 10 de Setembro de 2001
52
Interfaces
?
?
sem implementao
?
?
?
Herana mltipla:
?
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) {...}
}
56
Enumeraes
?
?
?
57
Arrays uni-dimensionais
?
?
?
Criao (alocao):
?
58
Arrays de Arrays *
?
Declarao
?
Utilizao
?
int[][] a; //
//array
array uni
uni-- dimensional de elem'
elem's do tipo int[]
59
Arrays multi-dimensionais *
?
Declarao
?
Criao
?
int[,] m;
m; //
//array
array bibi-dimensional de int's
Inicializao
?
Converso
?
60
Arrays
Mtodos e propriedades
?
61
Delegados e Eventos
62
Delegados (Delegates)
?
Tipo de delegado
Instncia de delegado
?
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);
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 *
?
+= new delegate
delegate-type
type(
(mtodo
mtodo)
)
? previamente
testa
testa-se se
no
Inroduo Linguagem
de Programao C#,
Joo Pascoal
Faria,
FEUP,
10 null
de Setembro(i.e.,
de 2001
68
Operadores e Instrues
69
Operadores e Instrues
?
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
?
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 *
?
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
78
79
unrios: +
- ! ~ ++ -- true false
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 *
?
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))
?
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
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
?
[return:
return:HRESULT]
HRESULT] public long F()
(){}
{}
Meta--atributo AttributeUsage
Meta
AttributeUsage::
?
89
90
Casos de Interoperao
?
COM interoperability:
interoperability:
?
91
92
93
[DllImport("user32.dll",EntryPoint="MessageBoxA")]
[DllImport("user32.dll",EntryPoint="MessageBoxA"
)]
static extern int MsgBox
MsgBox(
( ....);
[DllImport("user32.dll",CharSet=CharSet.ANSI")]
[DllImport("user32.dll",CharSet=CharSet.ANSI"
)]
static extern int MessageBox
MessageBox(
( ....);
[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
?
&
endereo
?
?
->
class UnsafeDemo {
public static unsafe void Main() {
Compilar com
/unsafe
95
Cdigo unsafe *
Alocao de arrays na stack
?
96
Cdigo unsafe *
Apontadores para objectos geridos
?
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
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
101
...
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
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, #undef
#if, #elif, #else, #endif
?
#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
?
auto--descritivo e portvel
auto
Mdulo
?
Aplicao
?
106
Assemblies
Controlo de verses
?
?
107
Assemblies
Nomes fortes (partilhados)
?
sn k Teste.key
[assembly:AssemblyKeyFile("Teste.key")]
108
Reflexo
?
J visto anteriormente
consulta de atributos
109
Multithreading *
?
Classe Thread
?
Classe AppDomain
?
Classe Monitor
?
mtodos: Enter
Enter,, Exit
Exit,, TryEnter
TryEnter,, Wait
Wait,, Pulse
Pulse,, ...
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\\Tabs/Language Settings\
Editor
Settings\C/C++
C/C++\\FileExtensions
112
Referncias e Recursos
?
C# Language Specification
(http://msdn.microsoft.com/library/default.as
p?URL=/library/dotnet/csspec/vclrfcsharpspec_
Start.htm))
Start.htm