Realmente depende se você sabe se oé uma string e o que deseja fazer com ela. Se seu comentário significa que orealmente é uma sequência, eu prefiro o (string)oelenco direto - é improvável que falhe.
A maior vantagem de usar a conversão direta é que, quando falha, você recebe uma InvalidCastException , que informa praticamente o que deu errado.
Com o asoperador, se onão for uma sequência, sestá definido como null, o que é útil se você não tiver certeza e quiser testar s:
string s = o as string;
if ( s == null )
{
// well that's not good!
gotoPlanB();
}
No entanto, se você não executar esse teste, usará smais tarde e lançará uma NullReferenceException . Eles tendem a ser mais comuns e muito mais difíceis de rastrear quando ocorrem na natureza, pois quase todas as linhas referenciam uma variável e podem jogar uma. Por outro lado, se você estiver tentando converter para um tipo de valor (qualquer primitivo ou estrutura como DateTime ), precisará usar a conversão direta - asisso não funcionará.
No caso especial de conversão para uma string, todo objeto possui um ToString, portanto seu terceiro método pode ser bom se onão for nulo e você acha que o ToStringmétodo pode fazer o que você deseja.