Você está na página 1de 28

A linguagem C#

Sobre o que iremos falar...

As caractersticas mais importantes da linguagem C# Alguma comparao c/ Java e C++ Reflexo crtica: aspectos positivos e negativos

Porqu C# ?

.Net uma plataforma interessante Java e C# so semelhantes

Ainda mais quando sobre .Net

C# a linguagem de eleio no .Net

Hello World
using System;

public class HelloWorld { public static void Main(string[] args) { Console.WriteLine(Hello World!); } }

Semelhante a Java e C++


public class Pessoa { private string Nome; private int Idade; public Pessoa(string nome, int idade) { this.Nome = nome; this.Idade = idade; } public void MostraInfo() { Console.WriteLine({0}, tem {1} anos, Nome, Idade); } } Pessoa Cliente = new Pessoa(Carlos, 25); Cliente.MostraInfo();

C# - Caractersticas

Linguagem OO:
Muito semelhante ao C++ / Java fcil comear a programar em C#

Sistema unificado de tipos

Tudo pode ser visto como um objecto

Suporte directo Programao Baseada em Componentes


Propriedades, Eventos e Atributos Assemblies

Tudo um objecto!
int val = 10; object obj = val; int k = (int) obj; // k fica c/ valor 10

val
obj

10
System.Int32

10

} Boxing
}
Unboxing

10

Tudo um objecto (2)


C#
Hashtable ht = new Hashtable(); ht.Add(1, Xpto); ht.Add(2, Xpti);

JAVA
Hashtable ht = new Hashtable();
ht.put(new Integer(1), Xpto); ht.put(new Integer(2), Xpti);

O fim das classes de wrapping!

Tudo um objecto (3)

Tudo deriva de System.Object Mtodos:


Equals GetType ToString Finalize MemberwiseClone GetHashCode

C# base

Controlo de execuo
if, for, do, while, switch, foreach... switch sem fall-through: switch a {

case 2: x = 4; goto case 3 // fall-through explcito case 3: ...

foreach:

int[] tabela = {1, 2, 3};


foreach (int i in tabela) Console.WriteLine({0}, i);

Sistema de Tipos
String

string Nome; int[] tabela; class Pessoa { ... } enum Estado { Ligado, Desligado} struct Ponto { int x; int y; }
sbyte ushort uint ulong decimal

Array

Object

Class

Enum

ValueType

Struct

bool char float double

byte short int long

decimal conta;

Passagem de parmetros

ref passagem de tipos-valor por referncia


void g(ref char pc) { pc =x; }

{... char c=c; g(ref c); }

out - passagem de tipos-valor no inicializados por


referncia:
{... int x; f(out x); }

void f(out int x) {


x=2; }

Passagem de parmetros

params passagem de n varivel de parmetros

public static void Main() { UseParams(1, 'a', "test"); int[] myarray = new int[3] {10,11,12}; UseParams(myarray); }

public static void UseParams(params object[] list) { for ( int i = 0 ; i < list.Length ; i++ ) Console.WriteLine(list[i]); Console.WriteLine(); }

Herana
public class Pessoa { private string Nome; private int Idade; public Pessoa(string nome, int idade) { this.Nome = nome; this.Idade = idade; } public void MostraInfo() { virtual void MostraInfo() { Console.WriteLine({0}, tem {1} anos, Nome, Idade); } }

Por omisso, os mtodos no so virtuais!

Herana
public class Empregado : Pessoa { private string Empresa; public Empregado(string nome, int idade, int empresa) : base(nome, idade) { this.Empresa = empresa; } public override void MostraInfo() { base.MostraInfo(); Console.WriteLine(Empresa: {0}, Empresa); } }

Por omisso, os mtodos no so virtuais!

Binding esttico vs. dinmico


public class Base { void Xpto() { Console.WriteLine(Base.Xpto()); } virtual void Xpti() { Console.WriteLine(Base.Xpti()); } } public class Derivada : Base { new void Xpto() { Console.WriteLine(Deriv.Xpto()); } override void Xpti() { Console.WriteLine(Deriv.Xpti()); } } Derivada d = new Derivada(); d.Xpto(); d.Xpti(); Base dref = d; dref.Xpto(); dref.Xpti(); // Resulta em Deriv.Xpto() // Resulta em Deriv.Xpti()

// Resulta em Base.Xpto() // resulta em Deriv.Xpti()

Interfaces
interface ILeitorCD { void TocaCD(CD cd); }
public class Aparelhagem : ILeitorCD { void TocaCD(CD cd) { ... } } public class Computador : ILeitorCD { void TocaCD(CD cd) { ... } } Aparelhagem sony = new Aparelhagem(); Computador pc = new Computador(); ILeitorCD leitor; leitor = sony; leitor.tocaCD(GreatestHits);

leitor = pc; leitor.tocaCD(GreatestHits);

Redefinio de Operadores

Em C# possvel redefinir os operadores existentes.

Lista A = new Lista(); Lista B = new Lista(); A.Add(1); A.Add(2);

B.Add(3); B.Add(4);
Lista C = A + B; // Junta ambas as listas

Redefinio de Operadores (2)


public class Lista { private object[] ... Lista A = new Lista(); Lista B = new Lista(); Elementos; ...

Lista C = A + B;

public static Lista operator+(Lista a, Lista b) { Lista resultado = new Lista(); // Copia os elementos de <a> e <b> para // a lista <resultado> return resultado; } }

Unsafe Code

O C# suporta elementos avanados, como a utilizao de ponteiros Sempre que so utilizados estes elementos, o cdigo tem de ser colocado dentro de um contexto unsafe
public unsafe void FastCopy(byte* dst, byte* src, int count) { for (int i=0; i<count; i++) *dst++ = *src++; }

int total = 0; unsafe { int* ptr = &total;

*ptr = 10;
}

C# vs. C++

GC destri objectos inacessveis Tipos de referncia e tipos-valor Boxing, unboxing Redefinio de mtodos tem de ser explcita

C# vs. C++ (2)

boolean no so inteiros switch sem fall-through No se podem usar variveis sem atribuio (out) No h mtodos globais

C# vs Java

S h um Main Vrias classes num ficheiro namespaces em vez de packages

C# vs Java (2)

Goto foreach Redefinio de operadores Enumeraes Tipos-valor e Boxing Cdigo inseguro (unsafe) ref serve para passar por referncia

Documentao em XML

/// /// /// /// /// /// /// /// /// ///

<summary> Este mtodo calcula o ordenado de uma pessoa, baseado nos seus dias de trabalho. </summary> <param name=diasTrabalho"> O nmero de dias que trabalhou. </param> <returns> O salrio da pessoa. </returns>

public int CalculaOrdenado(int diasTrabalho) { ... }

Exerccio 1

Abra o VisualStudio.Net Construa a aplicao Hello World como Console Application

Utilize o mtodo WriteLine da classe Console

Construa uma aplicao semelhante, agora como Windows Application

Utilize o mtodo Show da classe MessageBox

Exerccio 2

Crie um novo projecto C# de Windows Application Adicione um novo ficheiro de classes (.cs) Defina a interface IListaNomes, que dever incluir interfaces para:

Adicionar novo nome lista de nomes Retornar a listagem de todos os nomes presentes na lista de nomes, sob a forma de uma cadeia de caracteres Limpar o contedo da lista de nomes

Exerccio 2 (continuao)

Crie uma classe que implemente IListaNomes e crie uma instncia dessa classe na sua Windows Form. (Utilize a classe ArrayList para guardar os nomes) Construa a Windows Form por forma a utilizar todas as funcionalidades fornecidas pela interface IListaNomes Coloque breakpoints em cada mtodo da classe e verifique que cada mtodo da mesma chamado e executado correctamente