O documento descreve como C# é uma linguagem de programação moderna e orientada a objetos. Ele explica porque usar C# ao invés de linguagens de baixo nível como Assembly, e como a Common Language Runtime permite que programas C# sejam executados em diferentes plataformas. O documento também cobre tópicos como tipos de dados, operadores, condições, ciclos, exceções, orientação a objetos, interfaces e namespaces na linguagem C#.
3. C# é uma linguagem de
programação moderna e orientada
por objectos.
mas… porquê usar C#?
4. Assembler
i386 i386 bin
ARM ARM bin
6502 6502 bin
Z80 Z80 bin
Código assembly binário para correr
específico de um CPU num tipo de CPUs.
5. Compilador Assembler
de C
i386 i386 bin
Programa
ARM ARM bin
em C
… … bin
Código assembly binário para correr
específico de um CPU num tipo de CPUs.
6. Quando compilamos um programa
escrito em C, ele só pode funcionar
na plataforma para o qual foi
compilado.
E em C#?
7. Compilador CLR
de C#
Programa Código Código
em C# CIL nativo
Bytecode
8. Quando compilamos o programa em
C#, é gerado código CIL (Common
Intermediate Language)
Esse código intermédio é executado
com ajuda de uma Common
Language Runtime
9. x86 CIL
add eax, edx ldloc.0
ldloc.1
add
PIC16F628a stloc.0
addwf 20h, f
10. Desta forma, um programa escrito
em C#, depois de compilado, é
platform-independent
28. Orientação por Objectos
Member Os StandartMembers e os
PremiumMembers partilham
certos atributos e métodos
em comum…
Mas também têm
StandartMember PremiumMember diferentes tipos de
comportamento!
29. Orientação por Objectos
Com programação orientada por
objectos, podemos usar classes
para reaproveitar código.
Cada objecto individual, chama-se
uma instância.
30. Orientação por Objectos
public class PremiumMember : Member
{
int premiumScore;
public abstract class Member
{ public void IncreaseScore()
protected string nick; {
protected int age; if (this.active)
this.premiumScore++;
protected bool active; else
} throw new Exception("Increasing
score of inactive member!");
}
}
31. Orientação por Objectos
Member abe = new StandartMember()
public class Member
abe.nick = “Abraham Lincoln”;
{
protected string nick;
Member membro = new PremiumMember();
protected int age;
membro.nick = “Miguel Pedroso”;
membro.age = 20;
protected bool active;
membro.active = true;
}
membro.IncreaseScore();
32. Orientação 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
próprio tipo, com o tipo de uma super-
classe, ou com o tipo da interface que
implementa.
35. Orientação por Objectos
private apenas acessível na própria classe;
protected também acessível nas suas sub-classes;
public acessível por qualquer outra classe;
internal acessível no mesmo assembly;
protected internal acessível no mesmo assembly ou
nas suas sub-classes.
37. Orientação por Objectos
sealed nenhuma outra classe pode herdar desta;
abstract indica que esta classe deve servir de base
para outras sub-classes e não pode ser
instanciada;
static declara uma classe como sendo estática.
38. Controlar acesso a atributos
public class MyClass
public class MyClass
{
{
private int _age;
public int Age
{
public int Age
get;
{
private set;
get{ return _age; }
}
set{ _age = value; }
}
}
}
39. Orientação por Objectos
(classes estáticas)
public static class MPMath
{
public static int Factorial(int n) int result = MPMath.Factorial(5);
{ System.Console.WriteLine(result);
if (n == 0)
return 1;
else
return n * Factorial(n - 1);
}
}
40. Interfaces
public interface IExample Uma interface pode ser
{
int DoSomething(); considerada uma lista de
} “coisas” que um objecto pode
fazer.
public class Class1 : IExample
{
public int DoSomething() Numa interface podem ser
{ colocados os protótipos das
// Do something
return 0; funções e variáveis a serem
} implementados por uma
} dada classe.
41. Interfaces
public interface IExample public class Class2 : Class1, IExample
{ {
int DoSomething(); public int DoSomething()
} {
// Do something
public class Class1 return 0;
{ }
public int DoSomething() }
{
// Do something
return 0;
}
}
42. enums
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
Days day = Days.Sat;
Os enums são utilizados para descrever
enumerações, de um conjunto de
constantes.
43. Métodos
private int makeColor (int r, int g, int b)
{
Vários métodos podem ter o
// Do Stuff mesmo nome, desde que
} recebam argumentos
private int makeColor (int r, int g, int b, int a)
diferentes.
{
// Do Stuff Os métodos podem ter
}
argumentos opcionais.
private int makeColor (int r, int g, int b, int a = 0)
{
// Do Stuff
}
44. Passagem por referência
Em C# podemos passar
private int doStuff()
{
argumentos por referência, e
int foo = 4 não apenas por valor.
updateValue(ref foo);
Console.WriteLine(foo.ToString());
}
Para isso usamos a palavra
reservada “ref” ou “out”.
private void updateValue(ref int val)
{
val = val / 2 + 1;
A palavra “ref” obriga a que
} variável cuja referência é
passada, já tenha sido
inicializada.
45. namespaces
using System.Text;
using System.Windows.Forms; Em C# temos namespaces,
que permitem organizar o
namespace SampleNamespace
{
código e ter vários tipos com
public class Class1 o mesmo nome.
{
}
Um namespace pode conter
} classes, intefaces, enums e
structs.
46. Até agora vimos o básico…
Mas onde está o verdadeiro
poder do C# e da .NET
Framework?
47.
48. Ok, mas agora como é que
uso a .NET Framework para
fazer coisas?
51. Numa bitmap de 24bits, cada
pixel tem 3 componentes na sua
cor, Red, Green e Blue.
Para converter-mos para Black &
White, calculamos a média das
três componentes.
52. Mas como trabalhamos com
imagens em C#, precisamos de
fazer download de bibliotecas?
Não! Basta usar o
System.Drawing!
53. 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);
56. Mas como fazer download
de ficheiro em C#?
E como usar Regex para
extrair os URLs?
Precisamos de 2 bibliotecas
e 1000 linhas de código?
57. Não! Basta usar o System.Net e o
System.Text.RegularExpressions
da .NET Framework!
58. using (WebClient client = new WebClient())
{
string html = client.DownloadString("http://hackerschool.ist.utl.pt/");
Regex regex = new Regex("http://([w+?.w+])+([a-zA-Z0-
9~!@#$%^&*()_-=+/?.:;',]*)?",
RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches(html);
foreach (Match match in matches)
MessageBox.Show(match.Value.ToString());
}
72. Desafio
Trocar os valores de duas variaveis
tipo “int”, sem recorrer a uma
terceira variável temporária... E
sem usar XORs!
Ambos os valores iniciais só
podem valer de 0 a 1000.
73. int a = 3;
int b = 4;
int temp;
Como fazer a troca sem
recorrer a variáveis
temporárias ou a XORS?
74. 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);
75. 1 A 0000 0001
7 B 0000 0111
A 0000 0001 b |= (a << 4);
B 0001 0111
A 0000 0111 a = b & 0x000F;
B 0001 0111
7 A 0000 0111 b >>= 4;
1 B 0000 0001