Você está na página 1de 75

C#

@miguelpedroso

(C Sharp)
@miguelpedroso

C# uma linguagem de programao moderna e orientada por objectos.


mas porqu usar C#?

Assembler

i386 ARM

i386 bin ARM bin 6502 bin

6502
Z80

Z80 bin

Cdigo assembly especfico de um CPU

binrio para correr num tipo de CPUs.

Compilador de C

Assembler

i386 Programa em C ARM

i386 bin ARM bin bin

Cdigo assembly especfico de um CPU

binrio para correr num tipo de CPUs.

Quando compilamos um programa escrito em C, ele s pode funcionar na plataforma para o qual foi compilado.
E em C#?

Compilador de C#

CLR

Programa em C#

Cdigo CIL

Cdigo nativo

Bytecode

Quando compilamos o programa em C#, gerado cdigo CIL (Common Intermediate Language) Esse cdigo intermdio executado com ajuda de uma Common Language Runtime

x86

CIL ldloc.0 ldloc.1 add stloc.0

add eax, edx

PIC16F628a addwf 20h, f

Desta forma, um programa escrito em C#, depois de compilado, platform-independent

Hello, World

public class HelloW { public static void Main() { System.Console.WriteLine("Hello, World!"); } }

Tipos de dados byte, sbyte, short, ushort, int, uint, long, ulong, float, double, decimal, bool, object char, string

string str1 = Hello; string str2 = World ; string str3 = str1 + + str3 + 0.ToString() Console.WriteLine(str3); Output: Hello World 0

Em C# as variveis locais tm de ser inicializadas antes de serem utilizadas. int i = new int(); ou
int i = 0;

decimal vs double quando queremos tratar de valores monetrios, devemos usar sempre o tipo decimal!

decimal vs double
static void Main(string[] args) { decimal cash1 = 99999999999999.99M; decimal result = cash1 - 1M;

double cash2 = 99999999999999.99D; double result2 = cash2 - 1.0D;


Console.WriteLine("Decimal: " + result.ToString() + "\n Double: " + result2.ToString()); Console.ReadLine(); }

Output: Decimal: 99999999999998,99 Double: 99999999999999

Why? :)

Operadores =, +, -, *, /, % ==, !=, <, <=, >= ! (Negao Lgica), ~ (Complemento Bitwise)

Operadores ++, --, +=, -=, *=, /= <<, >>, |, &, ^ &&, ||

Operadores && vs & && um AND condicional (true && false) retorna false (1 & 3) retorna 1

Operador Ternrio int foo = (condition) ? 4 : 3;

Condies
if (condition) action(); else if (condition2) action2(); else action3();

Ciclos
while (condition) { instructions; } do { instructions; } while (condition) for (decl, condition, action) { instructions; }

Ciclos Infinitos

while (true);
for ( ; ; );

Ciclos foreach
string name = "Miguel Ferreira de S Pedroso"; string []arr = name.Split(" ".ToCharArray()); foreach (string str in arr) System.Windows.Forms.MessageBox.Show(str.ToUpper());

...

Excepes
try { int a = 0; int b = 2 / a; } catch (Exception err) { System.Windows.Forms.MessageBox.Show(err.Message); } finally { // Do something }

Orientao por Objectos


Member

StandartMember

PremiumMember

Orientao por Objectos


Member Os StandartMembers e os PremiumMembers partilham certos atributos e mtodos em comum

StandartMember

PremiumMember

Mas tambm tm diferentes tipos de comportamento!

Orientao por Objectos


Com programao orientada por objectos, podemos usar classes para reaproveitar cdigo. Cada objecto individual, chama-se uma instncia.

Orientao por Objectos


public class PremiumMember : Member { int premiumScore; public void IncreaseScore() { if (this.active) this.premiumScore++; else throw new Exception("Increasing score of inactive member!"); } }

public abstract class Member { protected string nick; protected int age; protected bool active;
}

Orientao por Objectos

public class Member { protected string nick; protected int age; protected bool active;

Member abe = new StandartMember() abe.nick = Abraham Lincoln;

Member membro = new PremiumMember(); membro.nick = Miguel Pedroso; membro.age = 20; membro.active = true; membro.IncreaseScore();

Orientao por Objectos (Polimorfismo)


Member abe = new StandartMember() abe.nick = Abraham Lincoln;
PremiumMember membro = new PremiumMember(); StandartMember lincoln = (StandartMember)abe;

Podemos usar uma classe com o seu prprio tipo, com o tipo de uma superclasse, ou com o tipo da interface que implementa.

Orientao por Objectos


object

UInt32

Member

String

StandartMember

PremiumMember

Orientao por Objectos

{access modifier} class Member { {access modifier} string nick; }

Orientao por Objectos

private protected public internal protected internal

apenas acessvel na prpria classe; tambm acessvel nas suas sub-classes; acessvel por qualquer outra classe; acessvel no mesmo assembly; acessvel no mesmo assembly ou nas suas sub-classes.

Orientao por Objectos

{access modifier} {modifier} class Member { {access modifier} string nick; }

Orientao por Objectos

sealed abstract

static

nenhuma outra classe pode herdar desta; indica que esta classe deve servir de base para outras sub-classes e no pode ser instanciada; declara uma classe como sendo esttica.

Controlar acesso a atributos


public class MyClass { private int _age; public int Age { get{ return _age; } set{ _age = value; } } }

public class MyClass { public int Age { get; private set; } }

Orientao por Objectos (classes estticas)


public static class MPMath { public static int Factorial(int n) { if (n == 0) return 1; else return n * Factorial(n - 1); } }

int result = MPMath.Factorial(5); System.Console.WriteLine(result);

Interfaces
public interface IExample { int DoSomething(); } public class Class1 : IExample { public int DoSomething() { // Do something return 0; } }

Um interface pode ser considerada uma lista de coisas que um objecto pode fazer. Numa interface podem ser colocados os prottipos das funes e variveis a serem implementados por uma dada classe.

Interfaces
public interface IExample { int DoSomething(); } public class Class1 { public int DoSomething() { // Do something return 0; } } public class Class2 : Class1, IExample { public int DoSomething() { // Do something return 0; } }

enums
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; Days day = Days.Sat;

Os enums so utilizados para descrever enumeraes, de um conjunto de constantes.

Mtodos
private int makeColor (int r, int g, int b) { // Do Stuff }
private int makeColor (int r, int g, int b, int a) { // Do Stuff }

Vrios mtodos podem ter o mesmo nome, desde que recebam argumentos diferentes. Os mtodos podem ter argumentos opcionais.

private int makeColor (int r, int g, int b, int a = 0) { // Do Stuff }

Passagem por referncia


private int doStuff() { int foo = 4 updateValue(ref foo); Console.WriteLine(foo.ToString()); }

Em C# podemos passar argumentos por referncia, e no apenas por valor. Para isso usamos a palavra reservada ref ou out. A palavra ref obriga a que varivel cuja referncia passada, j tenha sido inicializada.

private void updateValue(ref int val) { val = val / 2 + 1; }

namespaces
using System.Text; using System.Windows.Forms;

namespace SampleNamespace { public class Class1 {


} }

Em C# temos namespaces, que permitem organizar o cdigo e ter vrios tipos com o mesmo nome. Um namespace pode conter classes, intefaces, enums e structs.

At agora vimos o bsico Mas onde est o verdadeiro poder do C# e da .NET Framework?

Ok, mas agora como que uso a .NET Framework para fazer coisas?

Exemplo Construir um programa de que converta uma imagem que est no clipboard para preto e branco.

Numa bitmap de 24bits, cada pixel tem 3 componentes na sua cor, Red, Green e Blue.
Para converter-mos para Black & White, calculamos a mdia das trs componentes.

Mas como trabalhamos com imagens em C#, precisamos de fazer download de bibliotecas?
No! Basta usar o System.Drawing!

Bitmap bp = (Bitmap)Clipboard.GetImage(); Color color; int average;

for (int i = 0; i < bp.Height; i++) for (int j = 0; j < bp.Width; j++) { color = bp.GetPixel(j, i); average = (color.R + color.G + color.B) / 3; bp.SetPixel(j, i, Color.FromArgb(average, average, average)); } Clipboard.SetImage((Image)bp);

Exemplo 2 Construir o esqueleto de um web spider.

Mas como fazer download de ficheiro em C#?


E como usar Regex para extrair os URLs? Precisamos de 2 bibliotecas e 1000 linhas de cdigo?

No! Basta usar o System.Net e o System.Text.RegularExpressions da .NET Framework!

using (WebClient client = new WebClient()) { string html = client.DownloadString("http://hackerschool.ist.utl.pt/"); Regex regex = new Regex("http://([\\w+?\\.\\w+])+([a-zA-Z09\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?", RegexOptions.IgnoreCase); MatchCollection matches = regex.Matches(html); foreach (Match match in matches) MessageBox.Show(match.Value.ToString()); }

Que plataformas correm programas feitos em C#?

Windows

mas no s!

Com a Mono Framework, podemos correr C# em muitas outras plataformas!

Com a Mono Framework, podemos correr C# em muitas outras plataformas!

E o que uso para programar em C#?

Visual Studio A verso Express gratuita, enquanto que a verso Ultimate paga.

Visual Studio O IST tem uma parceria com a Microsoft e fornece a verso Ultimate gratuita para alunos de alguns cursos!

MonoDevelop Uma IDE opensource e multi-plataforma, para Windows, Linux ou Mac

Emulador de NES

Desenvolvido em C#

Jogo de Sokoban

Website: http://miguelpedroso.com
Email: miguelfsp@gmail.com contact@miguelpedroso.com

HS:

http://hackerschool.ist.utl.pt

Obrigado!
@miguelpedroso

Desafio Trocar os valores de duas variaveis tipo int, sem recorrer a uma terceira varivel temporria... E sem usar XORs! Ambos os valores iniciais s podem valer de 0 a 1000.

int a = 3; int b = 4; int temp; Como fazer a troca sem recorrer a variveis temporrias ou a XORS?

int a = 3; int b = 4; MessageBox.Show("a=" + a + "\nb=" + b); b |= (a << 16); a = b & 0xFFFF; b >>= 16; MessageBox.Show("a=" + a + "\nb=" + b);

1 7

A 0000 0001 B 0000 0111 A 0000 0001 B 0001 0111 A 0000 0111 B 0001 0111 b |= (a << 4);

a = b & 0x000F;

7 1

A 0000 0111 B 0000 0001

b >>= 4;