Certificação C# Programming parte 2: Consumir tipos | Alura Cursos Online
Primeiras aulas do curso Certificação C# Programming parte 2: Consumir tipos
Box ou unbox para converter entre tipos de valor - Introdução
Olá, meu nome é Marcelo Oliveira. Boas vindas ao curso Certificação 70-483 Programming in C# parte 2, ou Programando em C#.
Veremos a continuação da primeira parte do curso na qual abordamos alguns tópicos necessários para conseguir realizar o exame da Microsoft para adquirir a certificação.
Entraremos na internet na página para procurar a página da Microsoft referente a esse exame. Digitaremos "Microsoft 70-483" e encontraremos essa página. Nela haverá uma lista dos requisitos necessários para a prova.
Encontraremos nosso tópico principal, "Criar e usar tipos", e no link veremos os assuntos abordados nessa segunda parte do curso. Vamos abordar o tópico referente a "Consumir tipos". Entenderemos agora como os tópicos foram mapeados para nossas aulas.
Começaremos com a aula 1, referente ao tópico de Boxing e unboxing. No material da Microsoft haverá o material para entender box e unbox de tipos de valor.
Na aula 2 veremos o trecho seguinte que diz respeito a Conversões, ou seja, conversões diversas, cast de tipos. Abordaremos conversões implícitas ou explícitas, os operadores de conversão IS e AS, conversões definidas pelo usuário e as de classes auxiliares.
Continuaremos com a aula 3, em que vamos lidar com Tipos dinâmicos. Trataremos da diferença entre string, var, object e dynamic para a declaração de variáveis; a conversão entre dynamic e outros tipos estáticos; a resolução de sobrecarga e adicionar membros dinamicamente. O último trecho será sobre como garantir a interoperabilidade do código C# para acessar as APIs COM, para acessar programas como Microsoft Office, abrir uma planilha e modificá-la, por exemplo, utilizando os tipos dinâmicos.
Espero que gostem da segunda parte do nosso curso. Até logo.
Box ou unbox para converter entre tipos de valor - Boxing e unboxing
Entraremos na Aula 5, seguindo as pastas já disponibilizadas para a primeira parte do curso.
No Item 1, Boxing, teremos um código que declara a variável numero como sendo do tipo int. Atribuímos a ela o valor 57.
Já trabalhamos com tipos de valores e tipos de referência e aprendemos a diferença entre eles. Agora passaremos uma variável do tipo valor para o tipo referência.
Para isso, precisaremos primeiro declarar uma variável como do tipo referência, por exemplo, uma variável object que chamaremos de caixa. Ela receberá um valor, mas não será um valor de referência, como uma nova instância de uma classe. Ela receberá um tipo primitivo, como a própria variável numero, que é do tipo valor.
Então, a caixa, do tipo object receberá um valor primitivo. Quando fazemos isso, é como se estivéssemos colocando o valor 57 dentro de uma caixa, que é o objeto. Chamamos essa operação de boxing.
O número "57" é adicionado dentro de uma caixa porque essa operação é necessária para conseguirmos colocar um valor, nesse caso um inteiro, dentro de um objeto. A variável caixa é como uma caixa fechada, do tipo object.
Também vemos uma operação de boxing quando chamamos o método, e esse método recebe como parâmetros tipos object mas passamos tipos de valores, como um inteiro ou um booleano.
Num outro exemplo de boxing, imprimiremos no console a chamada de um método para concatenar strings. Esse método está na classe string e passaremos como argumento o primeiro parâmetro, a string Resposta. Toda string é do tipo referência, então não há uma novidade.
A novidade é quando colocamos como segundo parâmetro a variável ´numero´, que é um tipo de valor e do tipo inteiro. Em seguida, passaremos como parâmetro um tipo booleano como um verdadeiro, true.
Quando passamos o mouse em cima do método Concat(), vemos que ele tem uma assinatura que recebe três objetos como parâmetro. Estamos passando numero e true, que são tipos de valores. Para que ele os receba, o .NET faz uma operação de boxing internamente.
int numero = 57;
object caixa = numero;
Console.WriteLine(string.Concat("Resposta", numero, true));`
Rodaremos a aplicação com F5 e vamos escolher a opção "22", "Boxing". O método Concat() da classe string fez a concatenação entre a palavra "Resposta" mais o número "57" e o valor booleano "true". Leremos Resposta57true
Continuando, pegaremos o item 2, Unboxing para fazer a operação inversa, ou seja, tirar o valor da caixa. Teremos a declaração da variável numero que é igual a 57 seguida da operação de boxing, colocar um tipo de valor dentro da caixa, dentro do tipo referência, que no caso é a variável caixa que é um objeto.
Queremos extrair o valor inteiro dessa caixa e poderemos fazer isso em primeiro lugar declarando uma variável int chamada unboxed, que significa "desencaixotado" em Inglês. Tentaremos atribuir caixa a essa variável, mas o compilador acusará um erro, já que ele não permite uma conversão implicita entre um objeto e um tipo valor.
Como já vimos anteriormente, o que precisamos fazer para solucionar esse problema será uma operação de cast, uma conversão explícita, que precisa ser feita por meio de parênteses na frente de caixa em que passaremos o tipo desejado. Digamos que queremos fazer o unboxing de uma caixa para o tipo inteiro curto, short.
Fizemos a operação de cast e vamos tentar colocar o valor caixa para a unboxed, que é do tipo int.
int unboxed = (short)caixa;
catch (System.InvalidException e)
System.Console.Writeline("{0} Erro: unboxing incorreto.", e)
Vamos rodar a aplicação para ver se conseguimos fazer o unboxing e selecionaremos a opção "23". Porém, aparecerá um erro no console informando que a conversão especificada não é válida.
Vamos parar a aplicação. Em tempo de compilação, não tivemos problemas, mas o erro aconteceu porque em termos de conversão, o tipo short não pode ser convertido para o tipo int. Então colocaremos o tipo int para fazer o cast da caixa. Teremos int unboxed = (int)caixa,
Rodando a aplicação de novo, veremos "Unboxing Ok." no terminal.
Então inicialmente vimos como converter uma variável do tipo valor, um int em um object, e depois vimos a operação de unboxing para converter de volta uma variável object para um tipo int. Quando fazemos isso, na verdade estamos trabalhando com cópias de valores.
Nossa variável caixa continua tendo o valor "57", porém criamos uma cópia a partir desse valor que foi armazenada na variável unboxed.
Cast de tipos - Conversões Implícitas
Agora veremos na Aula 6 o item 1, Conversões Implícitas.
No código declararemos uma variável do tipo int que chamaremos de inteiro e armazenará um número bem grande, como "2_123_456_789". Atribuiremos o valor dessa variável a uma outra de outro tipo, um inteiro longo ou long. Chamaremos a segunda variável de inteiroLongo e ela receberá inteiro.
O compilador aceita a instrução de atribuição, mesmo as variáveis sendo de tipos diferentes. Vamos imprimir no console o valor de inteirolongo
int inteiro = 2_123_456_789
long inteiroLongo = inteiro;
Console.Writeline(inteiroLongo);
Rodaremos a aplicação com "F5" e selecionaremos a opção "24" do console. Percebemos que agora a variável inteiroLongo estará armazenando uma cópia do valor da variável inteiro.
E se fizéssemos o contrário? Pegaremos o inteiro agora e atribuiremos o valor da variável inteiroLongo. No entanto, o compilador não permitirá fazer essa conversão implícita.
Por que funcionou da primeira vez? Comentaremos a linha do código referente a segunda tentativa de conversão e vamos pensar num exemplo da vida real.
Podemos fazer um paralelo entre despejar o conteúdo de um recipiente pequeno, uma xícara, para outro maior e as variáveis inteiro e inteiroLongo. Sendo assim, o compilador também avalia o tamanho dos "recipientes", e quando fazemos a atribuição ele verifica se não tentamos transferir o conteúdo de uma variável maior para uma menor.
//inteiro = inteiroLongo;
Se o tamanho da variável que recebe consiga abrigar o conteúdo da outra, a conversão será feita sem problemas.
Veremos agora um outro caso com tipos de referência, ou a conversão implícita utilizando objetos. Declararemos uma variável como gato e ela será uma nova instância de Gato, classe que já vimos anteriormente. Gato está herdando da classe Animal.
Vamos declarar uma outra variável que chamaremos de animal e receberá a mesma referência sendo armazenada em gato . Essa é a atribuição de um objeto de um tipo para um objeto de outro. O compilador não dará nenhum erro.
Agora imprimiremos no console o tipo da variável animal. Para imprimir, usaremos um Console.Writeline(). Utilizaremos o método .GetType() dentro dos parâmetros para pegar o tipo.
Animal animal = gato;
Vamos rodar com F5, selecionar a opção "24"e veremos que o tipo é "certificacao_csharp_roteiro.Gato", ou seja, ele está armazenando internamente o tipo Gato apesar de termos declarado a variável como um tipo Animal.
Faremos outro teste utilizando uma interface. Declararemos IAnimal, uma interface implementada pela classe Animal, e uma variável Ianimal, que receberá o valor gato. Também não haverá erros de compilação. Imprimiremos no console o valor do tipo de Ianimal.
IAnimal Ianimal = gato;
Console.Writeline(Ianimal.GetType());
Veremos que Ianimal estará armazenando um tipo Gato. Então também podemos usar uma conversão implícita quando nossa variável de destino é uma interface implementada por uma classe Gato ou uma classe-base de Gato, no caso, Animal.
E se fizermos o contrário? Vamos tentar atribuir a variável animal à variável gato, ou seja, gato = animal. Teremos um erro de compilação pois não podemos passar um tipo Animal para um tipo Gato. Fazendo o mesmo com a interface, gato = Ianimal, teremos o mesmo problema da conversão implícita não acontecer.
Só conseguimos fazer a conversão implícita quando utilizamos como destino uma variável do tipo base da classe sendo recebida, ou uma interface implementada pela classe ou por uma classe base da classe Gato.
Verificando uma tabela de conversões para os tipos de valor, veremos quais são os tipos de origem e os tipos de destino válidos para conversões implícitas. Os tipos menores como sbyte e byte podem ser convertidos para vários outros tipos. Mas conforme os tamanhos aumentam, por exemplo, o short e o int, terão tipos de destino mais limitados.
O tipo float só poder´ser convertido implicitamente para um tipo double e o double ou decimal não poderão ser convertidos para nenhum outro tipo.
Então, como faremos nesses casos? Será impossível fazer uma atribuição de um tipo maior para um menor?
É possível e veremos como fazer isso a seguir, tratando de conversões explícitas.
Sobre o curso Certificação C# Programming parte 2: Consumir tipos
O curso Certificação C# Programming parte 2: Consumir tipos possui 124 minutos de vídeos, em um total de 47 atividades. Gostou? Conheça nossos outros cursos de .NET em Programação, ou leia nossos artigos de Programação.