Back-End

13 jul, 2018

Iniciando com C# – Parte 02: tipos de dados e estruturas de controle

100 visualizações
Publicidade

O C#, por ser uma linguagem de tipagem forte, foca bastante no tipo que é atribuído a cada variável. Na tabela a seguir, vemos os tipos primitivos existentes, o tamanho e os valores de cada um:

Fonte: https://www.caelum.com.br/apostila-csharp-orientacao-objetos/variaveis-e-tipos-primitivos/

É muito interessante prestarmos atenção no tamanho que cada variável comporta para obtermos a melhor performance da nossa aplicação e não sobrecarregarmos a memória sem necessidade, evitando optar por uma variável que aloca muito espaço na memória quando, na verdade, será usado um espaço pequeno e já determinado.

Há casos onde você pode querer guardar o valor de várias variáveis dentro de um mesmo conjunto. Um exemplo disso é guardar as cores que um semáforo possui.

Para fazer isso, podemos fazer o uso do Array, que é um conjunto de um mesmo tipo que referencia diferentes espaços em memória, podendo ser organizado por um índice, conforme exemplo a seguir:

Ambas as formas funcionam, como podemos ver no resultado da aplicação console. Escrevendo Semaforo[1] e Semaforo2[1], estamos obtendo o valor que está no índice 1 do Array –  Amarelo!

Arrays sempre começam na posição zero!

Se vocês repararem, eu coloquei Console.ReadKey no final. Isso faz com que a aplicação fique “esperando” que eu digite algo para encerrar, me permitindo visualizar a saída do programa –  que são as duas linhas “Amarelo”. Se não colocássemos o Console.ReadKey, não daria nem tempo de vermos, que o console já fecharia.

Para representar as cores do semáforo, também podemos usar a estrutura Enum. Essa estrutura guarda um conjunto de valores que normalmente não são alterados, como as cores de um semáforo (Verde, Amarelo e Vermelho) ou os meses que um ano possui (Janeiro, Fevereiro, Março e até Dezembro). Podemos fazer da seguinte maneira:

Também é possível atrelar um valor ao Enum e exibir o mesmo como saída do programa, como pode ser visto abaixo (efetuando a atribuição do valor nos campos do Enum e efetuando um cast na saída para um tipo inteiro):

Estrutura de Controle

If/Else

Quem nunca ouviu falar daquele if/else que os programadores comentam? Essas duas palavrinhas são parte da estrutura de controle que temos nos nossos sistemas. Elas são necessárias quando o programa precisa tomar uma determinada decisão mediante o valor de algum cálculo ou uma variável e, dependendo de seu valor, o caminho pode ser x ou y durante a execução do software:

O programa não imprimiu a cor Amarelo, conforme o exemplo que tínhamos feito há pouco. Isso aconteceu porque a variável corSemaforo que nosso if (se) está comparando com 2 está com o valor 1! Dessa forma, nosso programa “pulou” o primeiro bloco e foi para o segundo, do else (senão), printando para nós “A cor é Amarelo!”.

Para comparar, deve-se utilizar o operador de igualdade duas vezes! (“==”).

Também é possível adicionar mais blocos, colocando else if.

Switch/Case

Essa estrutura também pode ser utilizada para fazermos condicionais em C#.

Abaixo, o código escrito e a saída dele no console, respectivamente:

O switch/case possui a seguinte estrutura:

  • Primeira parte: determinamos qual variável iremos analisar – switch((char(numero))) ;
  • Segunda parte: determinamos as comparações, já predefinidas  – case 1, por exemplo. Caso a condição seja verdadeira ((char(numero)) seja igual a 1), o conteúdo que estiver dentro deste bloco será executado, até o comando break, que determina a última linha a ser executada por aquele bloco.

O operador default é utilizado quando nenhuma das condições anteriores é satisfeita. No nosso caso, digitamos 4, que não entra nem no primeiro, nem no segundo bloco. Portanto, é exibido no console o texto contido no bloco default.

Observação: Notem que estou lendo um valor digitado pelo usuário (Console.Read). Vou atribuir este valor (convertido para char) para a variável numero. Mas por que tenho que converter para char? Porque quando utilizamos o Console.Read, estamos obtendo o código do caractere digitado pelo usuário usando como base a tabela ASCII (http://www.ricardoarrigoni.com.br/tabela-ascii-completa/). Portanto, se eu digitar 5, o valor retornado pelo Console.Read é 53, seguindo a tabela. Convertendo para char, obtemos o próprio caractere que digitamos.

Estruturas de Repetição

Quando desejamos que um bloco de nosso programa seja repetido num determinado número de vezes, utilizamos estruturas de repetição, o famoso loop. Nessa estrutura, o determinado bloco será executado enquanto a instrução que passarmos para o programa for verdadeira.

For

O for possui a seguinte estrutura, separada por “;”:

  • Primeira parte: inicialização (int i = 0);
  • Segunda parte: condição (i < numeros.Length);
  • Terceira parte: incremento/decremento (i++);

Na imagem acima, estamos imprimindo os números contidos no nosso array numeros enquanto o valor da variável i é menor que o tamanho do array (que é 10!). Sei que o tamanho dele é 10, pois estamos comportando nele 10 números. No entanto, caso sua aplicação seja complexa, você pode não ter essa informação de forma clara. Assim, você pode descobrir o valor passando o mouse em numeros.Length em tempo de execução, colocando um breakpoint na linha que contém a expressão antes de executar o programa, e o valor será exibido quando o programa começar sua execução e passar por aquela linha.

While

O mesmo programa que escrevemos acima poderia ter sido escrito dessa forma, utilizando o while.

Nesta estrutura, declaramos nosso contador (o i, no caso) antes da estrutura, e incrementados o mesmo dentro do bloco.

O for é mais utilizado quando queremos iterar uma sequência de dados, enquanto o while é mais visto para determinar se uma condição não é suprida.

Do While

Muito parecido com o while, esta estrutura faz a verificação da condição no final do bloco, diferente do anterior, que verifica a veracidade da instrução no início. Dependendo do que seu programa irá testar, pode ser significativa a mudança entre uma e outra, mesmo sendo semelhantes.

Foreach

O foreach é mais utilizado pela facilidade que apresenta ao percorrer objetos contidos em coleções, como arrays e listas (sim! Não falamos de listas ainda!). Ele permite acessarmos as propriedades dos campos que vamos percorrer de forma mais simples que os anteriores.

Para demonstrarmos essa estrutura, iremos utilizar o List.

As listas são, como os arrays, utilizadas para armazenarmos um conjunto de valores. No entanto, elas são dinâmicas. Isso significa que, caso não saibamos qual tamanho que a lista terá, tudo bem! Elas podem ser incrementadas durante a execução do programa e novos elementos podem ser inseridos nela.

A imagem acima contém uma exemplificação de listas e da estrutura foreach. Criamos uma lista denominada Frutas que receberá elementos do tipo string –  mas não sabemos quantos.

Adicionamos elementos nessa lista com o Add e, feito isso, printaremos cada fruta contida na lista Frutas, utilizando o foreach. Fácil, não é?

Além disso, podemos brincar bastante com as listas utilizando estruturas que aprendemos anteriormente!

Utilizamos no exemplo acima a estrutura de controle if/else para verificar se alguma fruta possui a letra “o” com o Contains, que é um dos artifícios que possuímos ao utilizar as listas. A que possuir, printamos na tela!

Ao colocarmos, na nossa condição do if/else, uma exclamação à esquerda, negaremos a instrução, fazendo com que sejam trazidas as frutas que não contêm a letra “o”!

Por hoje é só, pessoal!

No próximo artigo, falaremos sobre orientação a objetos!