Upload
internet
View
139
Download
1
Embed Size (px)
Citation preview
A linguagem C#A linguagem C#
Sobre o que iremos falar...Sobre o que iremos falar...
As características mais importantes da As características mais importantes da linguagem C#linguagem C#
Alguma comparação c/ Java e C++Alguma comparação c/ Java e C++
Reflexão crítica: aspectos positivos e Reflexão crítica: aspectos positivos e negativosnegativos
Porquê C# ?Porquê C# ?
.Net é uma plataforma interessante.Net é uma plataforma interessante
Java e C# são semelhantesJava e C# são semelhantes Ainda mais quando sobre .NetAinda mais quando sobre .Net
C# é a linguagem de eleição no .NetC# é a linguagem de eleição no .Net
““Hello World”Hello World”
using System;using System;
public class HelloWorld public class HelloWorld {{ public static void Main(string[] args) public static void Main(string[] args) {{ Console.WriteLine(“Hello World!”);Console.WriteLine(“Hello World!”); }}}}
Semelhante a Java e C++Semelhante a Java e C++public class Pessoapublic class Pessoa{{ private string private string Nome;Nome; private int private int Idade;Idade;
public Pessoa(string nome, int idade) {public Pessoa(string nome, int idade) { this.Nome = nome;this.Nome = nome; this.Idade = idade;this.Idade = idade; }}
public void MostraInfo() {public void MostraInfo() { Console.WriteLine(“{0}, tem {1} anos”, Console.WriteLine(“{0}, tem {1} anos”, Nome, Idade);Nome, Idade); }}}}
Pessoa Cliente = new Pessoa(“Carlos”, 25);
Cliente.MostraInfo();
C# - CaracterísticasC# - Características
Linguagem OO:Linguagem OO: Muito semelhante ao C++ / JavaMuito semelhante ao C++ / Java É fácil começar a programar em C#É fácil começar a programar em C#
Sistema unificado de tiposSistema unificado de tipos Tudo pode ser visto como um objectoTudo pode ser visto como um objecto
Suporte directo à Programação Baseada Suporte directo à Programação Baseada em Componentesem Componentes Propriedades, Eventos e AtributosPropriedades, Eventos e Atributos AssembliesAssemblies
Tudo é um objecto!Tudo é um objecto!
int val = 10;int val = 10;
object obj = val;object obj = val;
int k = (int) obj;int k = (int) obj; // k fica c/ valor 10// k fica c/ valor 10
System.Int32System.Int32 }} BoxingBoxing
1010
1010
val
obj
}} UnboxingUnboxing1010k
Tudo é um objecto (2)Tudo é um objecto (2)
JAVAJAVA
Hashtable ht Hashtable ht
= new Hashtable();= new Hashtable();
ht.put(new Integer(1), “Xpto”);ht.put(new Integer(1), “Xpto”);
ht.put(new Integer(2), “Xpti”);ht.put(new Integer(2), “Xpti”);
C#C#
Hashtable ht Hashtable ht
= new Hashtable();= new Hashtable();
ht.Add(1, “Xpto”);ht.Add(1, “Xpto”);
ht.Add(2, “Xpti”);ht.Add(2, “Xpti”);
O fim das classes de O fim das classes de wrappingwrapping!!
Tudo é um objecto (3)Tudo é um objecto (3)
Tudo deriva de Tudo deriva de System.ObjectSystem.Object Métodos: Métodos: EqualsEquals GetTypeGetType ToStringToString FinalizeFinalize MemberwiseCloneMemberwiseClone GetHashCodeGetHashCode
C# baseC# base Controlo de execuçãoControlo de execução
if, for, do, while, switch, if, for, do, while, switch, foreachforeach...... switch sem fall-through:switch sem fall-through:
foreach:foreach: int[] tabela = {1, 2, 3};int[] tabela = {1, 2, 3};
foreach (int i in tabela)foreach (int i in tabela)
Console.WriteLine(“{0}”, i);Console.WriteLine(“{0}”, i);
switch a {switch a {
case 2:case 2:
x = 4;x = 4;
goto case 3 goto case 3
// fall-through explícito// fall-through explícito
case 3:case 3:
......
Sistema de TiposSistema de Tipos
ObjectObject
StringString
ArrayArray
ValueTypeValueType
EnumEnum
StructStruct
intint
shortshort
bytebyte
charchar
floatfloat
decimaldecimal
longlong
uintuint
ulongulong
sbytesbyte
ushortushort
boolbool
doubledouble
ClassClass
string Nome;
int[] tabela;
class Pessoa { ... }
decimal conta;
enum Estado { Ligado, Desligado}
struct Ponto { int x; int y; }
Passagem de parâmetrosPassagem de parâmetros
refref – – passagem de tipos-valor por referênciapassagem de tipos-valor por referência{...{...
char c=‘c’;char c=‘c’;
g(ref c);g(ref c);
}}
outout - - passagem de tipos-valor não inicializados por passagem de tipos-valor não inicializados por referência:referência:{...{...
int x;int x;
f(out x);f(out x);
}}
void f(out int x) {void f(out int x) {
x=2; }x=2; }
void g(ref char pc) {void g(ref char pc) {
pc =‘x’; }pc =‘x’; }
Passagem de parâmetrosPassagem de parâmetros
paramsparams – – passagem de nº variável de parâmetrospassagem de nº variável de parâmetros
public static void Main() public static void Main()
{{ UseParams(1, 'a', "test"); UseParams(1, 'a', "test");
int[] myarray = new int[3] {10,11,12};int[] myarray = new int[3] {10,11,12}; UseParams(myarray);UseParams(myarray); }}
public static void UseParams(params public static void UseParams(params objectobject[] list) [] list) {{ for ( int i = 0 ; i < list.Length ; i++ )for ( int i = 0 ; i < list.Length ; i++ ) Console.WriteLine(list[i]);Console.WriteLine(list[i]); Console.WriteLine();Console.WriteLine(); }}
Herança Herança public class Pessoapublic class Pessoa{{ private string private string Nome;Nome; private int private int Idade;Idade;
public Pessoa(string nome, int idade) {public Pessoa(string nome, int idade) { this.Nome = nome;this.Nome = nome; this.Idade = idade;this.Idade = idade; }}
public void MostraInfo() {public void MostraInfo() { Console.WriteLine(“{0}, tem {1} anos”, Console.WriteLine(“{0}, tem {1} anos”, Nome, Idade);Nome, Idade); }}}}
public class Pessoapublic class Pessoa{{ private string private string Nome;Nome; private int private int Idade;Idade;
public Pessoa(string nome, int idade) {public Pessoa(string nome, int idade) { this.Nome = nome;this.Nome = nome; this.Idade = idade;this.Idade = idade; }}
public public virtualvirtual void MostraInfo() { void MostraInfo() { Console.WriteLine(“{0}, tem {1} anos”, Console.WriteLine(“{0}, tem {1} anos”, Nome, Idade);Nome, Idade); }}}}
Por omissão, os métodos não são virtuais!Por omissão, os métodos não são virtuais!
Por omissão, os métodos não são virtuais!Por omissão, os métodos não são virtuais!
Herança Herança public class Empregado : Pessoapublic class Empregado : Pessoa{{ private string Empresa;private string Empresa;
public Empregado(string nome, int idade, intpublic Empregado(string nome, int idade, int empresa) empresa)
: base(nome, idade): base(nome, idade) {{ this.Empresa = empresa;this.Empresa = empresa; }}
public public overrideoverride void MostraInfo() { void MostraInfo() { base.MostraInfo();base.MostraInfo(); Console.WriteLine(“Empresa: {0}”, Empresa);Console.WriteLine(“Empresa: {0}”, Empresa); }}}}
Binding estático vs. dinâmicoBinding estático vs. dinâmicopublic class Base {public class Base { void Xpto() { Console.WriteLine(“Base.Xpto()”); }void Xpto() { Console.WriteLine(“Base.Xpto()”); } virtual void Xpti() { Console.WriteLine(“Base.Xpti()”); }virtual void Xpti() { Console.WriteLine(“Base.Xpti()”); }}}
public class Derivada : Basepublic class Derivada : Base{{ new void Xpto() { Console.WriteLine(“Deriv.Xpto()”); }new void Xpto() { Console.WriteLine(“Deriv.Xpto()”); } override void Xpti() { Console.WriteLine(“Deriv.Xpti()”); }override void Xpti() { Console.WriteLine(“Deriv.Xpti()”); }}}
Derivada d = new Derivada();Derivada d = new Derivada();
d.Xpto();d.Xpto(); // Resulta em “Deriv.Xpto()”// Resulta em “Deriv.Xpto()”d.Xpti();d.Xpti(); // Resulta em “Deriv.Xpti()”// Resulta em “Deriv.Xpti()”
Base dref = d;Base dref = d;dref.Xpto();dref.Xpto(); // Resulta em “Base.Xpto()”// Resulta em “Base.Xpto()”dref.Xpti();dref.Xpti(); // resulta em “Deriv.Xpti()”// resulta em “Deriv.Xpti()”
InterfacesInterfacesinterface ILeitorCDinterface ILeitorCD{{ void TocaCD(CD cd);void TocaCD(CD cd);}}
public class Aparelhagem public class Aparelhagem : ILeitorCD : ILeitorCD{{ void TocaCD(CD cd) {void TocaCD(CD cd) { ...... }}}}
public class Computador public class Computador : ILeitorCD : ILeitorCD{{ void TocaCD(CD cd) {void TocaCD(CD cd) { ...... }}}}
Aparelhagem sony = newAparelhagem sony = new Aparelhagem(); Aparelhagem();Computador pc = new Computador pc = new Computador(); Computador();ILeitorCD leitor;ILeitorCD leitor;
leitor = sony;leitor = sony;leitor.tocaCD(GreatestHits);leitor.tocaCD(GreatestHits);
leitor = pc;leitor = pc;leitor.tocaCD(GreatestHits);leitor.tocaCD(GreatestHits);
Redefinição de OperadoresRedefinição de Operadores
Em C# é possível redefinir os operadores Em C# é possível redefinir os operadores existentes.existentes.
Lista A = new Lista();Lista A = new Lista();Lista B = new Lista();Lista B = new Lista();
A.Add(1);A.Add(1);A.Add(2);A.Add(2);
B.Add(3);B.Add(3);B.Add(4);B.Add(4);
Lista C = A + B; Lista C = A + B; // Junta ambas as listas// Junta ambas as listas
Redefinição de Operadores (2)Redefinição de Operadores (2)
public class Listapublic class Lista{{ private object[]private object[] Elementos;Elementos;
......
public static Lista operator+(Lista a, Lista b)public static Lista operator+(Lista a, Lista b) {{ Lista resultado = new Lista();Lista resultado = new Lista();
// Copia os elementos de <a> e <b> para // Copia os elementos de <a> e <b> para // a lista <resultado>// a lista <resultado>
return resultado;return resultado; }}}}
Lista A = new Lista();Lista A = new Lista();Lista B = new Lista();Lista B = new Lista();
......
Lista C = A + B;Lista C = A + B;
UnsafeUnsafe Code Code
O C# suporta elementos avançados, como O C# suporta elementos avançados, como a utilização de ponteirosa utilização de ponteiros
Sempre que são utilizados estes Sempre que são utilizados estes elementos, o código tem de ser colocado elementos, o código tem de ser colocado dentro de um contexto dentro de um contexto unsafeunsafe
int total = 0;int total = 0;
unsafeunsafe{{ int* ptr = &total;int* ptr = &total;
*ptr = 10;*ptr = 10;}}
public unsafe public unsafe void FastCopy(byte* dst, byte* src,void FastCopy(byte* dst, byte* src, int count) int count){{ for (int i=0; i<count; i++)for (int i=0; i<count; i++) *dst++ = *src++;*dst++ = *src++;}}
C# vs. C++C# vs. C++
GC destrói objectos inacessíveisGC destrói objectos inacessíveis Tipos de referência e tipos-valorTipos de referência e tipos-valor Boxing, unboxingBoxing, unboxing Redefinição de métodos tem de ser Redefinição de métodos tem de ser
explícitaexplícita
C# vs. C++ (2)C# vs. C++ (2)
booleanboolean não são inteiros não são inteiros switchswitch sem sem fall-throughfall-through Não se podem usar variáveis sem Não se podem usar variáveis sem
atribuição (atribuição (outout)) Não há métodos globaisNão há métodos globais
C# vs JavaC# vs Java
Só há um Só há um MainMain Várias classes num ficheiroVárias classes num ficheiro namespaces namespaces em vez deem vez de packages packages
C# vs Java (2)C# vs Java (2)
GotoGoto foreachforeach Redefinição de operadoresRedefinição de operadores EnumeraçõesEnumerações Tipos-valor e Tipos-valor e BoxingBoxing Código inseguro (Código inseguro (unsafeunsafe)) refref serve para passar por referência serve para passar por referência
Documentação em XMLDocumentação em XML
/// <summary>/// <summary>/// Este método calcula o ordenado de uma pessoa, /// Este método calcula o ordenado de uma pessoa, /// baseado nos seus dias de trabalho./// baseado nos seus dias de trabalho./// </summary>/// </summary>///////// <param name=“diasTrabalho">/// <param name=“diasTrabalho">/// O número de dias que trabalhou./// O número de dias que trabalhou./// </param>/// </param>///////// <returns> O salário da pessoa. </returns>/// <returns> O salário da pessoa. </returns>
public int CalculaOrdenado(int diasTrabalho)public int CalculaOrdenado(int diasTrabalho){{ ......}}
Exercício 1Exercício 1
Abra o VisualStudio.NetAbra o VisualStudio.Net Construa a aplicação “Hello World” como Construa a aplicação “Hello World” como
Console ApplicationConsole Application Utilize o métodoUtilize o método WriteLine WriteLine da classe da classe ConsoleConsole
Construa uma aplicação semelhante, agora Construa uma aplicação semelhante, agora como como Windows ApplicationWindows Application Utilize o método Utilize o método ShowShow da classe da classe MessageBoxMessageBox
Exercício 2Exercício 2
Crie um novo projecto C# de Crie um novo projecto C# de Windows Windows ApplicationApplication
Adicione um novo ficheiro de classes (.cs)Adicione um novo ficheiro de classes (.cs) Defina a interface IListaNomes, que deverá Defina a interface IListaNomes, que deverá
incluir interfaces para:incluir interfaces para: Adicionar novo nome à lista de nomesAdicionar novo nome à lista de nomes Retornar a listagem de todos os nomes presentes na Retornar a listagem de todos os nomes presentes na
lista de nomes, sob a forma de uma cadeia de lista de nomes, sob a forma de uma cadeia de caracterescaracteres
Limpar o conteúdo da lista de nomesLimpar o conteúdo da lista de nomes
Exercício 2 (continuação)Exercício 2 (continuação)
Crie uma classe que implemente IListaNomes e Crie uma classe que implemente IListaNomes e crie uma instância dessa classe na sua crie uma instância dessa classe na sua Windows Form. (Utilize a classe ArrayList para Windows Form. (Utilize a classe ArrayList para guardar os nomes)guardar os nomes)
Construa a Windows Form por forma a utilizar Construa a Windows Form por forma a utilizar todas as funcionalidades fornecidas pela todas as funcionalidades fornecidas pela interface IListaNomesinterface IListaNomes
Coloque Coloque breakpoints breakpoints em cada método da classe em cada método da classe e verifique que cada método da mesma é e verifique que cada método da mesma é chamado e executado correctamentechamado e executado correctamente