C# , 13 Mar 2013

Embed Size (px)

Citation preview

  • 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: [email protected]

    [email protected]

    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