Olá. Hoje estou aqui para falar sobre o CLR e um pouco sobre tipos e suas conversões, e sobre os operadores “is” e “as”.

Primeiro gostaria de lembrar que todo tipo de objeto é derivado, em última instância, de System.Object. Esta classe (System.Object) possui alguns métodos públicos, que são : Equals(retorna true se dois objetos tiverem o mesmo valor) ; GetHashCode(retorna um código HASH para o valor deste objeto) ; ToString(Retorna, por padrão, o nome completo do tipo) ; e o GetType( retorna uma instância de um objeto derivado de Type).

Suponhamos que temos uma classe chamada Leitor . O CLR requer que todos os objetos sejam criados com a utilização do operador new. Por Exemplo :

                        Leitor primeiroLeitor = new Leitor();

Mas o que o “NEW” faz? O operador NEW tem três funções :

1-     Reserva memória para o objeto alocando o número de bytes requerido para o tipo especificado.

2-     Inicializa os membros do objeto.

3-     O construtor de instância do tipo é chamado(neste caso sem nenhum parâmetro).

 

Ou seja, se temos a seguinte linha de código :

                        Leitor primeiroLeitor;

            Significa que não temos, ainda, um espaço de memória para ele. Vamos ter este espaço apenas quando usarmos o “= new Leitor()”

            A referência do objeto criado será salva na variável “primeiroLeitor”, que é do tipo Leitor.

 

            Quando você desenvolve um projeto, seja ele de grande porte ou de pequeno porte, você vai ter a necessidade de converter um tipo em diversos outros. O CLR permite a conversão de um objeto para seu tipo ou para qualquer um de seus tipos “pais”(tipo herdado). Existem várias maneiras de você converter um objeto em outro. As seguintes linhas de código fazem, praticamente, as mesmas coisas :

1-     Object obj = (Object)primeiroLeitor;

2-     Object obj = primeiroLeitor as Object;

 

Nestas duas linhas de código, o objeto que é do tipo “Leitor” está sendo convertido para o tipo “Object”.

 

Vamos criar mais uma classe para exemplificar :

      class Gold : Leitor{

}

 

Neste momento acabamos de criar uma classe Gold que herda de Leitor.

No código :

      Gold g = new Gold();

      Leitor primeiroLeitor = (Leitor) g;

Neste caso, estamos declarando uma variável ‘g’ que é do tipo ‘Gold’, e estamos convertendo-a para a variável ‘primeiroLeitor’ que é do tipo Leitor. Como o tipo ‘Gold’ herda de ‘Leitor’, este código executa normalmente e é válido.

Agora vamos analisar outro caso, neste caso seria exibido um erro :

      DateTime dia = new DateTime();

      Leitor primeiroLeitor = (Leitor) dia;

 

Neste caso, estamos tentando converter uma variável que é do tipo DateTime no tipo Leitor. Isto geraria um erro, pois uma variável DateTime não herda do tipo Leitor. Se o CLR permitisse a conversão, não haveria nenhuma segurança de tipo, e os resultados seriam imprevisíveis, podendo causar sérios erros no seu sistema.

            A confusão de tipos é a causa de muitas brechas de segurança e compromete a estabilidade e robustez da aplicação.

 

            Agora vou falar um pouco sobre os operadores “is” e “as”.

            O operador “is” verifica se um objeto é compatível com determinado tipo, e o resultado é um Boolean(true or false). Este operador(is) nunca lançará uma exceção. Vou dar um exemplo :

           

                        System.Object o = new System.Object();

                        bool b1 = (o is System.Object); // b1 é true

                        bool b2 = (o is Leitor); // b2 é false.

 

            O operador “as” funciona como a operação de conversão, e, assim como o “is”, ele nunca lançará uma exceção. Se o objeto não pode ser convertido no tipo desejado, o resultado será NULL. Vou dar mais um exemplo :

                        System.Object o = new System.Object();

                        Leitor primeiroLeitor = o as Leitor; // Tenta fazer a conversão para o tipo Leitor.

 

                        Como esta conversão não pode ser realizada, a variável ‘primeiroLeitor’ fica com o valor NULL, mas o código executa normalmente, sem exibir nenhuma exceção.

 

 

            Bem, vou ficando por aqui, e espero ter ajudado um pouco mais com conhecimentos sobre o framework .NET. Um ótimo final de semana, e até a próxima.