C#
     @miguelpedroso
(C Sharp)

       @miguelpedroso
C# é uma linguagem de
programação moderna e orientada
          por objectos.

     mas… porquê usar C#?
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.
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.
Quando compilamos um programa
escrito em C, ele só pode funcionar
   na plataforma para o qual foi
            compilado.

            E em C#?
Compilador              CLR
             de C#




Programa                Código           Código
  em C#                   CIL            nativo




                        Bytecode
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
x86            CIL

add eax, edx   ldloc.0
               ldloc.1
               add
PIC16F628a     stloc.0

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 variáveis locais têm de ser
inicializadas antes de serem utilizadas.

           int i = new int();

                  ou

               int i = 0;
decimal vs double

quando queremos tratar de valores
monetários, 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

     =, +, -, *, /, %

    ==, !=, <, <=, >=

    ! (Negação Lógica),
~ (Complemento Bitwise)
Operadores

++, --, +=, -=, *=, /=

   <<, >>, |, &, ^

       &&, ||
Operadores

          && vs &

 && é um AND condicional
(true && false) retorna false

     (1 & 3) retorna 1
Operador Ternário

int foo = (condition) ? 4 : 3;
Condições

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

while (condition)     for (decl; condition; action)
{                     {
  instructions;           instructions;
}                     }

             do
             {
                instructions;
             } while (condition)
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());




                                                 ...
Excepções

try
{
   int a = 0;
   int b = 2 / a;
}
catch (Exception err)
{
   System.Windows.Forms.MessageBox.Show(err.Message);
}
finally
{
   // Do something
}
Orientação por Objectos

                 Member




StandartMember        PremiumMember
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!
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.
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!");
                                   }
                                 }
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();
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.
Orientação por Objectos

                          object




UInt32                    Member                   String




         StandartMember            PremiumMember
Orientação por Objectos


{access modifier} class Member
{
    {access modifier} string nick;
}
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.
Orientação por Objectos


{access modifier} {modifier} class Member
{
    {access modifier} string nick;
}
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.
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; }
                              }
    }
}
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);
   }
}
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.
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;
    }
}
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.
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
                                          }
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.
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.
Até agora vimos o básico…

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 média das
       três componentes.
Mas como trabalhamos com
imagens em C#, precisamos de
fazer download de bibliotecas?

      Não! 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 código?
Não! 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-Z0-
9~!@#$%^&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 não 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 versão Express é gratuita,
  enquanto que a versão
     Ultimate é paga.
Visual Studio

  O IST tem uma parceria
com a Microsoft e fornece a
  versão 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 variável temporária... 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 variáveis
temporárias 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   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

Introdução ao C#

  • 1.
    C# @miguelpedroso
  • 2.
    (C Sharp) @miguelpedroso
  • 3.
    C# é umalinguagem 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 umprograma 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 oprograma 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, umprograma escrito em C#, depois de compilado, é platform-independent
  • 11.
  • 12.
    public class HelloW { public static void Main() { System.Console.WriteLine("Hello, World!"); } }
  • 13.
    Tipos de dados byte, sbyte, short, ushort, int, uint, long, ulong, float, double, decimal, bool, object char, string
  • 14.
    string str1 =“Hello”; string str2 = “World ”; string str3 = str1 + “ “ + str3 + 0.ToString() Console.WriteLine(str3); Output: Hello World 0
  • 15.
    Em C# asvariáveis locais têm de ser inicializadas antes de serem utilizadas. int i = new int(); ou int i = 0;
  • 16.
    decimal vs double quandoqueremos tratar de valores monetários, devemos usar sempre o tipo decimal!
  • 17.
    decimal vs double staticvoid 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? :)
  • 18.
    Operadores =, +, -, *, /, % ==, !=, <, <=, >= ! (Negação Lógica), ~ (Complemento Bitwise)
  • 19.
    Operadores ++, --, +=,-=, *=, /= <<, >>, |, &, ^ &&, ||
  • 20.
    Operadores && vs & && é um AND condicional (true && false) retorna false (1 & 3) retorna 1
  • 21.
    Operador Ternário int foo= (condition) ? 4 : 3;
  • 22.
    Condições if (condition) action(); else if (condition2) action2(); else action3();
  • 23.
    Ciclos while (condition) for (decl; condition; action) { { instructions; instructions; } } do { instructions; } while (condition)
  • 24.
    Ciclos Infinitos while(true); for ( ; ; );
  • 25.
    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()); ...
  • 26.
    Excepções try { int a = 0; int b = 2 / a; } catch (Exception err) { System.Windows.Forms.MessageBox.Show(err.Message); } finally { // Do something }
  • 27.
    Orientação por Objectos Member StandartMember PremiumMember
  • 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 Comprogramaçã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.
  • 33.
    Orientação por Objectos object UInt32 Member String StandartMember PremiumMember
  • 34.
    Orientação por Objectos {accessmodifier} class Member { {access modifier} string nick; }
  • 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.
  • 36.
    Orientação por Objectos {accessmodifier} {modifier} class Member { {access modifier} string nick; }
  • 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 aatributos 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 vimoso básico… Mas onde está o verdadeiro poder do C# e da .NET Framework?
  • 48.
    Ok, mas agoracomo é que uso a .NET Framework para fazer coisas?
  • 49.
    Exemplo Construir um programade que converta uma imagem que está no clipboard para preto e branco.
  • 51.
    Numa bitmap de24bits, 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 trabalhamoscom 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);
  • 55.
    Exemplo 2 Construir o“esqueleto” de um web spider.
  • 56.
    Mas como fazerdownload 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 usaro 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~!@#$%^&amp;*()_-=+/?.:;',]*)?", RegexOptions.IgnoreCase); MatchCollection matches = regex.Matches(html); foreach (Match match in matches) MessageBox.Show(match.Value.ToString()); }
  • 59.
  • 60.
    Windows… mas não só!
  • 61.
    Com a MonoFramework, podemos correr C# em muitas outras plataformas!
  • 62.
    Com a MonoFramework, podemos correr C# em muitas outras plataformas!
  • 63.
    E o queuso para programar em C#?
  • 64.
    Visual Studio A versãoExpress é gratuita, enquanto que a versão Ultimate é paga.
  • 65.
    Visual Studio O IST tem uma parceria com a Microsoft e fornece a versão Ultimate gratuita para alunos de alguns cursos!
  • 66.
    MonoDevelop Uma IDE opensourcee multi-plataforma, para Windows, Linux ou Mac
  • 68.
  • 69.
  • 70.
    Website: http://miguelpedroso.com Email: miguelfsp@gmail.com contact@miguelpedroso.com HS: http://hackerschool.ist.utl.pt
  • 71.
    Obrigado! @miguelpedroso
  • 72.
    Desafio Trocar os valoresde 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