Iniciando com C#—Parte 2—Tipos de Dados e Estruturas de Controle
O C#, por ser uma linguagem de tipagem forte, possui muito foco 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:
É 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 isto, 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… 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 varíavel 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.
Obs.: 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, iremos printar cada fruta contida na lista Frutas, utilizando o foreach. Fácil, não é?!
E 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, iremos negar a instrução, fazendo com que sejam trazidas as frutas que não contém a letra “o”!
Por hoje é só, pessoal!
Na próxima aula, falaremos sobre orientação a objetos! 😉