Realmente depende de si sabes si oes una cadena y qué quieres hacer con ella. Si su comentario significa que orealmente es una cadena, preferiría el (string)oreparto directo , es poco probable que falle.
La mayor ventaja de usar el lanzamiento directo es que cuando falla, obtienes una InvalidCastException , que te dice más o menos lo que salió mal.
Con el asoperador, si ono es una cadena, sse establece en null, lo cual es útil si no está seguro y desea probar s:
string s = o as string;
if ( s == null )
{
// well that's not good!
gotoPlanB();
}
Sin embargo, si no realiza esa prueba, la usará smás tarde y se generará una excepción NullReferenceException . Estos tienden a ser más comunes y mucho más difíciles de rastrear una vez que ocurren en la naturaleza, ya que casi todas las líneas desreferencian una variable y pueden arrojar una. Por otro lado, si está intentando convertir a un tipo de valor (cualquier primitivo, o estructuras como DateTime ), debe usar la conversión directa; asno funcionará.
En el caso especial de convertir a una cadena, cada objeto tiene un ToString, por lo que su tercer método puede estar bien si ono es nulo y cree que el ToStringmétodo podría hacer lo que desea.