Operadores ‘is’ e ‘as’ para conversões de tipo no C#

Casting geralmente é uma questão de dizer ao compilador que, embora só saiba que um valor é de algum tipo geral, você quer converte-lo a um tipo mais específico.

Simples exemplo de Casting

object myObj = "This is a new object";
string myString = (string) myObj ; // => Convert the object to string

Alguns tipos de conversões podem gerar exceções que deverão ser tratadas pelo desenvolvedor. Esta é uma vantagem de se trabalhar com os operadores is e as.

Sobre os operadores is e as

Operador is: compatibilidade de tipo. Retornará true se o operando esquerdo avaliado puder ser convertido no tipo especificado no operando à direita (um tipo estático).

Operador as: conversão de tipo. Retorna o operando esquerdo convertido para o tipo especificado pelo operando à direita (um tipo estático)
Observações:
– Null se não for possível
– Não levanta uma exceção

Eu montei um código com base do curso Jump Start C# da MVA.

Neste exemplo, foram criadas três classes que são estendidas de forma encadeada e utilizado os operadores para verificar seu tipo e depois realizar a conversão correta.

using System;

# region Model Classes
public class Animal // => High hierarchy class
{ 
	public int Id { get; set; }
}
public class Dog : Animal // => Dog extends from Animal
{ 
	public string Name { get; set; }
}
public class Golden : Dog // => Golden extends from Dog
{ 
	public int Age { get; set; }
}   
# endregion

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Start Console App");
         
        var animal = new Animal();
        var dog = new Dog();
        var golden = new Golden();
         
        var myPetz = new MyPets();
        myPetz.TakeAnimal(animal);
        myPetz.TakeAnimal(dog);
        myPetz.TakeAnimal(golden);
    }
 
}
 
public class MyPets // => Tests class
{
	/**
	 * TakeAnimal method takes a Animal as parameter. 
	 * But this can be a Dog, Golden or other class that inheritance from Animal
	 * We need to check inside the metod.
	 */
    public void TakeAnimal(Animal animal)
    {
        animal.Id = 1;
        if(animal is Dog) // => true when send golden and dog, both are "Dog"
        {
            var myDog  = animal as Dog; // => set the "animal" parameter as Dog
            if(myDog != null)
            {
                myDog.Name = "big boss";
            }
            Console.WriteLine("Class: " + myDog.ToString() + " | Name: " + myDog.Name);
        }
        if(animal is Golden) // => true when send golden
        {
            var myDog  = animal as Golden; // => set the "animal" parameter as Golden
            if(myDog != null)
            {
                myDog.Age = 10;
            }
            Console.WriteLine("Class: " + myDog.ToString() + " | Name: " + myDog.Name + " | Age: "+ myDog.Age);
        }
    }
}

Este código vai gerar a seguinte saída.

Start Console App
Class: Dog | Name: big boss
Class: Golden | Name: big boss
Class: Golden | Name: big boss | Age: 10

Existem outros tipo de conversões que podem ser realizadas e todas elas estão podem ser encontradas nos documentos oficiais da Microsoft “Casting and Type Conversions (C# Programming Guide)”

Qualquer dúvida ou dicas, entre em contato: leandrolt@gmail.com

Leave a Reply

Your email address will not be published. Required fields are marked *