considerar las siguientes alternativas:
Foo(someObj as SomeClass);
y:
Foo((SomeClass)someObj);
Debido a ser someObj del tipo incorrecto, la primera versión cruza por null
a Foo
. Algún tiempo después, esto da como resultado un lanzamiento de NullReferenceException
. ¿Cuánto más tarde? Depende de lo que haga Foo
. Puede almacenar el null
en un campo, y minutos más tarde se accede por algún código que espera que no sea null
.
Pero con la segunda versión, encuentra el problema inmediatamente.
¿Por qué hacer que sea más difícil arreglar los errores?
actualización
El PO se le preguntó en un comentario: ¿No es más fácil de usar as
y para verificar si null
en un comunicado por if
?
Si el null
es inesperado y es evidencia de un error en la persona que llama, se podría decir:
SomeClass c = someObj as SomeClass;
if (c == null)
{
// hmm...
}
¿Qué hacer en ese if
-bloque? Hay dos soluciones generales. Uno es lanzar una excepción, por lo que es responsabilidad del que llama para tratar su error. En cuyo caso es definitivamente más simple de escribir:
SomeClass c = (SomeClass)someObj;
Simplemente le ahorra escribir la lógica if
/throw
a mano.
Sin embargo, existe otra alternativa. Si tiene una implementación "estándar" de SomeClass
que está contento de usar donde no hay nada mejor disponible (tal vez tiene métodos que no hacen nada, o devuelven valores "vacíos", etc.) entonces puede hacer esto:
SomeClass c = (someObj as SomeClass) ?? _stockImpl;
Esto asegurará que c
nunca sea null
. ¿Pero es eso realmente mejor? ¿Qué pasa si la persona que llama tiene un error? ¿No quieres ayudar a encontrar errores? Al intercambiar en un objeto predeterminado, disimula el error. Eso suena como una idea atractiva hasta que pierdes una semana de tu vida tratando de localizar un error.
(En cierto modo esto imita el comportamiento de Objective-C, en el que cualquier intento de utilizar una referencia null
nunca va a tirar;. Simplemente en silencio no hace nada)
@Jarrett Meyer - esa pregunta pregunta cuál es la diferencia. Esta pregunta es diferente Al saber la diferencia, pregunta por qué un lanzamiento que lanza es mejor que un lanzamiento que no lanza. –