Hoje uma dúvida me atormentou e resolvi acabar com ela de uma vez por todas. Existem duas formas básicas de se fazer typecast em Delphi: TMinhaClasse(Objeto) ou (Objeto as TMinhaClass). A dúvida é que eu não sabia de verdade qual era a diferença entre as duas. Fui aos newsgroups da Borland, que é sem dúvida a melhor fonte de informação sobre Delphi existente na Internet.

A diferença é o seguinte, quando você usa TMinhaClasse(Objeto) o compilador não verifica se sua chamada é válida, ou seja, ele não verifica se Objeto pode ser tratado como um objeto da classe TMinhaClasse. É um “hard cast”. Só deve ser usado se você tem certeza absoluta que NUNCA vai passar um objeto errado para o cast, pois se isso acontecer, você poderá obter todo tipo de erro estranho, como access violations e coisas do tipo, sem realmente saber qual é o problema, pois ele não será indicado. O hard cast tem melhor performance, pois não verifica se a chamada é válida, mas deve ser usado com cautela. Você pode testar o objeto antes usando o operador “is”, desta forma:

if (Objeto is TMinhaClasse) then
   TMinhaClasse(Objeto)…

Agora quando usamos (Objeto as TMinhaClasse), uma verificação é feita em runtime para verificar se a chamada é válida. Caso não seja, uma exceção será gerada. Essa opção é mais segura, pois caso você cometa um engano, saberá exatamente o problema assim que ele acontecer, evitando maiores dores de cabeça.

No Delphi 8, existe uma pequena diferença, a primeira forma TMinhaClasse(Objeto) retorna nil se não for uma chamada válida. Isso facilita um pouco o rastreamento de erros, pois provavelmente gerará uma exceção logo que você tentar utilizar o objeto resultado do typecast.