Post on 03-Apr-2018
7/29/2019 C# , 13 Mar 2013
1/75
C#
@miguelpedroso
7/29/2019 C# , 13 Mar 2013
2/75
(C Sharp)
@miguelpedroso
7/29/2019 C# , 13 Mar 2013
3/75
C# uma linguagem de
programao moderna e orientada
por objectos.
mas porqu usar C#?
7/29/2019 C# , 13 Mar 2013
4/75
i386
ARM
6502
Assembler
i386 bin
ARM bin
6502 bin
Cdigo assembly
especfico de um CPU
binrio para correr
num tipo de CPUs.
Z80 Z80 bin
7/29/2019 C# , 13 Mar 2013
5/75
Programaem C
i386
ARM
Compilador
de C
Assembler
i386 bin
ARM bin
bin
Cdigo assembly
especfico de um CPU
binrio para correr
num tipo de CPUs.
7/29/2019 C# , 13 Mar 2013
6/75
Quando compilamos um programa
escrito em C, ele s pode funcionar
na plataforma para o qual foi
compilado.
E em C#?
7/29/2019 C# , 13 Mar 2013
7/75
Programaem C#
Compilador
de C#
CdigoCIL
Bytecode
CLR
Cdigonativo
7/29/2019 C# , 13 Mar 2013
8/75
Quando compilamos o programa emC#, gerado cdigo CIL (Common
Intermediate Language)
Esse cdigo intermdio executado
com ajuda de uma Common
Language Runtime
7/29/2019 C# , 13 Mar 2013
9/75
x86
addeax, edx
PIC16F628a
addwf20h, f
CIL
ldloc.0
ldloc.1add
stloc.0
7/29/2019 C# , 13 Mar 2013
10/75
Desta forma, um programa escrito
em C#, depois de compilado, platform-independent
7/29/2019 C# , 13 Mar 2013
11/75
Hello, World
7/29/2019 C# , 13 Mar 2013
12/75
publicclassHelloW
{
publicstaticvoid Main()
{System.Console.WriteLine("Hello, World!");
}
}
7/29/2019 C# , 13 Mar 2013
13/75
Tipos de dados
byte, sbyte, short, ushort,
int, uint, long, ulong, float, double,
decimal, bool, object
char, string
7/29/2019 C# , 13 Mar 2013
14/75
string str1 = Hello;
string str2 = World ;
string str3 = str1 + + str3 + 0.ToString()
Console.WriteLine(str3);
Output: Hello World 0
7/29/2019 C# , 13 Mar 2013
15/75
int i = new int();
ou
int i = 0;
Em C# as variveis locais tm de serinicializadas antes de serem utilizadas.
7/29/2019 C# , 13 Mar 2013
16/75
decimal vs double
quando queremos tratar de valores
monetrios, devemos usar sempre o
tipo decimal!
7/29/2019 C# , 13 Mar 2013
17/75
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();
}
decimal vs double
Decimal: 99999999999998,99Double: 99999999999999
Output: Why? :)
7/29/2019 C# , 13 Mar 2013
18/75
Operadores
=, +, -, *, /, %
==, !=,
7/29/2019 C# , 13 Mar 2013
19/75
Operadores
++, --, +=, -=, *=, /=
, |, &, ^
&&, ||
7/29/2019 C# , 13 Mar 2013
20/75
Operadores
&& vs &
&& um AND condicional
(true && false) retorna false
(1 & 3) retorna 1
7/29/2019 C# , 13 Mar 2013
21/75
Operador Ternrio
int foo = (condition) ? 4 : 3;
7/29/2019 C# , 13 Mar 2013
22/75
Condies
if(condition)
action();else if(condition2)
action2();
elseaction3();
7/29/2019 C# , 13 Mar 2013
23/75
Ciclos
while (condition)
{
instructions;}
for (decl, condition, action)
{
instructions;}
do{
instructions;
} while (condition)
7/29/2019 C# , 13 Mar 2013
24/75
Ciclos Infinitos
while (true);
for ( ; ; );
7/29/2019 C# , 13 Mar 2013
25/75
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());
...
7/29/2019 C# , 13 Mar 2013
26/75
Excepes
try
{
int a = 0;
int b = 2 / a;}
catch (Exception err)
{
System.Windows.Forms.MessageBox.Show(err.Message);
}finally
{
// Do something
}
7/29/2019 C# , 13 Mar 2013
27/75
Orientao por Objectos
Member
StandartMember PremiumMember
7/29/2019 C# , 13 Mar 2013
28/75
Orientao por Objectos
Member
StandartMember PremiumMember
Os StandartMembers e os
PremiumMembers partilham
certos atributos e mtodosem comum
Mas tambm tm
diferentes tipos de
comportamento!
7/29/2019 C# , 13 Mar 2013
29/75
Orientao por Objectos
Com programao orientada por
objectos, podemos usar classespara reaproveitar cdigo.
Cada objecto individual, chama-seuma instncia.
7/29/2019 C# , 13 Mar 2013
30/75
Orientao por Objectos
public abstract class Member
{protected string nick;
protected int age;
protected bool active;
}
public class PremiumMember : Member
{
int premiumScore;
publicvoid IncreaseScore()
{
if(this.active)
this.premiumScore++;
else
throw new Exception("Increasingscore of inactive member!");
}
}
7/29/2019 C# , 13 Mar 2013
31/75
Orientao por Objectos
public class Member
{
protected string nick;
protected int age;
protected bool active;
}
Member abe = newStandartMember()
abe.nick = Abraham Lincoln;
Member membro = newPremiumMember();
membro.nick = Miguel Pedroso;
membro.age = 20;
membro.active = true;
membro.IncreaseScore();
7/29/2019 C# , 13 Mar 2013
32/75
Orientao por Objectos
(Polimorfismo)
Member abe = newStandartMember()
abe.nick = Abraham Lincoln;
PremiumMember membro = newPremiumMember();
StandartMember lincoln = (StandartMember)abe;
Podemos usar uma classe com o seuprprio tipo, com o tipo de uma super-
classe, ou com o tipo da interface que
implementa.
7/29/2019 C# , 13 Mar 2013
33/75
Orientao por Objectos
Member
StandartMember PremiumMember
object
StringUInt32
7/29/2019 C# , 13 Mar 2013
34/75
Orientao por Objectos
{access modifier} class Member{
{access modifier} string nick;
}
7/29/2019 C# , 13 Mar 2013
35/75
Orientao por Objectos
private
protectedpublic
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.
7/29/2019 C# , 13 Mar 2013
36/75
Orientao por Objectos
{access modifier} {modifier} class Member{
{access modifier} string nick;
}
7/29/2019 C# , 13 Mar 2013
37/75
Orientao por Objectos
sealed
abstract
static
nenhuma outra classe pode herdar desta;
indica que esta classe deve servir de basepara outras sub-classes e no pode ser
instanciada;
declara uma classe como sendo esttica.
7/29/2019 C# , 13 Mar 2013
38/75
Controlar acesso a atributos
public class MyClass
{
privateint _age;
public int Age
{
get{ return _age; }
set{ _age = value; }
}}
public class MyClass
{
public int Age
{
get;
privateset;
}
}
7/29/2019 C# , 13 Mar 2013
39/75
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);
7/29/2019 C# , 13 Mar 2013
40/75
Interfaces
Um interface pode ser
considerada uma lista de
coisas que um objecto podefazer.
Numa interface podem ser
colocados os prottipos das
funes e variveis a serem
implementados por uma
dada classe.
public interface IExample
{
int DoSomething();
}
public class Class1 : IExample
{
public int DoSomething()
{
// Do somethingreturn 0;
}
}
7/29/2019 C# , 13 Mar 2013
41/75
Interfaces
public interface IExample
{
int DoSomething();
}
public class Class1
{
public int DoSomething()
{
// Do somethingreturn 0;
}
}
public class Class2 : Class1, IExample
{
public int DoSomething()
{ // Do something
return 0;
}
}
7/29/2019 C# , 13 Mar 2013
42/75
enums
enumDays {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
Days day = Days.Sat;
Os enums so utilizados para descrever
enumeraes, de um conjunto deconstantes.
7/29/2019 C# , 13 Mar 2013
43/75
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
}
private int makeColor (int r, int g, int b, int a = 0)
{
// Do Stuff
}
Vrios mtodos podem ter o
mesmo nome, desde que
recebam argumentos
diferentes.
Os mtodos podem ter
argumentos opcionais.
7/29/2019 C# , 13 Mar 2013
44/75
Passagem por referncia
private int doStuff()
{
int foo = 4
updateValue(reffoo);Console.WriteLine(foo.ToString());
}
private void updateValue(ref int val)
{
val = val / 2 + 1;}
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 quevarivel cuja referncia
passada, j tenha sido
inicializada.
7/29/2019 C# , 13 Mar 2013
45/75
namespaces
using System.Text;
using System.Windows.Forms;
namespace SampleNamespace
{
publicclass Class1
{
}
}
Em C# temos namespaces,
que permitem organizar ocdigo e ter vrios tipos com
o mesmo nome.
Um namespace pode conter
classes, intefaces, enums estructs.
7/29/2019 C# , 13 Mar 2013
46/75
7/29/2019 C# , 13 Mar 2013
47/75
7/29/2019 C# , 13 Mar 2013
48/75
Ok, mas agora como que
uso a .NET Framework parafazer coisas?
7/29/2019 C# , 13 Mar 2013
49/75
Exemplo
Construir um programa de
que converta uma imagemque est no clipboard para
preto e branco.
7/29/2019 C# , 13 Mar 2013
50/75
7/29/2019 C# , 13 Mar 2013
51/75
Numa bitmap de 24bits, cadapixel tem 3 componentes na sua
cor, Red, Green e Blue.
Para converter-mos para Black &
White, calculamos a mdia das
trs componentes.
7/29/2019 C# , 13 Mar 2013
52/75
Mas como trabalhamos com
imagens em C#, precisamos de
fazer download de bibliotecas?
No! Basta usar o
System.Drawing!
7/29/2019 C# , 13 Mar 2013
53/75
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);
7/29/2019 C# , 13 Mar 2013
54/75
7/29/2019 C# , 13 Mar 2013
55/75
7/29/2019 C# , 13 Mar 2013
56/75
Mas como fazer downloadde ficheiro em C#?
E como usar Regex paraextrair os URLs?
Precisamos de 2 bibliotecase 1000 linhas de cdigo?
7/29/2019 C# , 13 Mar 2013
57/75
No! Basta usar o System.Net e o
System.Text.RegularExpressionsda .NET Framework!
7/29/2019 C# , 13 Mar 2013
58/75
using (WebClient client = newWebClient())
{
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());}
7/29/2019 C# , 13 Mar 2013
59/75
7/29/2019 C# , 13 Mar 2013
60/75
Windows
mas no s!
7/29/2019 C# , 13 Mar 2013
61/75
Com a Mono Framework, podemos correr
C# em muitas outras plataformas!
7/29/2019 C# , 13 Mar 2013
62/75
Com a Mono Framework, podemos correr
C# em muitas outras plataformas!
7/29/2019 C# , 13 Mar 2013
63/75
E o que uso para programarem C#?
7/29/2019 C# , 13 Mar 2013
64/75
Visual Studio
A verso Express gratuita,enquanto que a verso
Ultimate paga.
7/29/2019 C# , 13 Mar 2013
65/75
Visual Studio
O IST tem uma parceriacom a Microsoft e fornece a
verso Ultimategratuita
para alunos de alguns
cursos!
7/29/2019 C# , 13 Mar 2013
66/75
MonoDevelop
Uma IDE opensource emulti-plataforma, para
Windows, Linux ou Mac
7/29/2019 C# , 13 Mar 2013
67/75
7/29/2019 C# , 13 Mar 2013
68/75
Emulador de NES
Desenvolvido
em C#
7/29/2019 C# , 13 Mar 2013
69/75
Jogo de Sokoban
7/29/2019 C# , 13 Mar 2013
70/75
Website: http://miguelpedroso.com
Email: miguelfsp@gmail.com
contact@miguelpedroso.com
HS: http://hackerschool.ist.utl.pt
7/29/2019 C# , 13 Mar 2013
71/75
Obrigado!
@miguelpedroso
7/29/2019 C# , 13 Mar 2013
72/75
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.
7/29/2019 C# , 13 Mar 2013
73/75
int a = 3;
int b = 4;
int temp;
Como fazer a troca sem
recorrer a variveis
temporrias ou a XORS?
7/29/2019 C# , 13 Mar 2013
74/75
int a = 3;int b = 4;
MessageBox.Show("a=" + a + "\nb=" + b);
b |= (a >= 16;
MessageBox.Show("a=" + a + "\nb=" + b);
7/29/2019 C# , 13 Mar 2013
75/75
A 0 0 0 0 0 0 0 1B 0 0 0 0 0 1 1 1
A 0 0 0 0 0 0 0 1
B 0 0 0 1 0 1 1 1
A 0 0 0 0 0 1 1 1
B 0 0 0 1 0 1 1 1
A 0 0 0 0 0 1 1 1
B 0 0 0 0 0 0 0 1
b |= (a >= 4;
17
7
1