Depois de 3 e-mails recebidos em menos de 1 mes, onde colegas me perguntaram para que serve e qual a diferença entre os operadores is e as do C#, resolvi postar aqui a resposta que enviei à eles e, assim contribuir com os demais colegas que possam ter a mesma dúvida.
Operador is:
Este operador verifica se objeto é compatível com um determinado tipo, e o resultado desta avaliação é um valor booleano (True ou False). A vantagem deste operador é que ele nunca lançará uma Exception, mesmo quando os tipos não forem compatíveis. O código abaixo demonstra isso:
public class Cliente{}
//….
object obj = new Object();
bool teste1 = (obj is Object); // Retorna True
bool teste2 = (obj is Cliente); // Retorna False
Assim sendo, podemos ter um if comparando se o tipo é compatível com outro e sendo, fazermos o cast (conversão):
if(obj is Cliente){
Cliente c = (Cliente)o;
//….
}
O único problema deste código é que o CLR verificará o tipo do objeto duas vezes, ou seja, na condicional o operador is fará essa verificação e, logo após, passando por esta verificação e agora já dentro do bloco if antes da conversão ser feita, uma nova verificação é realizada perdendo assim em performance.
Operador as:
É neste caso que o operador as entra em ação. Ele verifica se o objeto é compatível com o tipo Cliente e, se for, o operador retorna um ponteiro (não nulo) para este objeto. Se caso o tipo não for compatível, então como o operador is, também é retornado nulo. Com isso, o tipo só é verificado uma vez. O código abaixo exemplifica o uso do operador as e comprova o ganho no desempenho:
Cliente c = obj as Cliente;
if(c != null){
//….
}
Lembre-se que a verificação (if) se faz necessário, pois caso o objeto for incompatível, o operador as retornará nulo, e uma Exception do tipo System.NullReferenceException será atirada ao cliente.
Nota: Felizmente no VB.NET 2005 teremos também um operador semelhante: o TryCast, como é explicado neste post.