2010-01-14 18 views

Respuesta

15

Un objeto no tiene nombre, entonces, ¿cómo puede decirle el nombre? La referencia nula puede haber sido cargado desde una variable - o podría haber sido devuelto por un método, propiedad, etc

El JIT podría probablemente vistazo a la información de la pila de averiguar qué tipo de referencia declarado era , pero no estoy seguro de la frecuencia con la que esto podría ayudar, y sin duda esto desaceleraría las cosas.

No puedo decir que alguna vez he encontrado que esto es una gran carga cuando se trata de depuración: si hay muchas cosas que pueden ser nulas en una sola línea, eso generalmente sugiere que vale la pena dividirlas Más.

+1

Gracias a la traza extremadamente detallada de la pila, no creo que deba ser más detallada. Además, deberían estar usando afirmaciones para evitar esto en primer lugar. – ChaosPandion

+2

Cualquier tipo de depuración ralentiza las cosas. Me pregunto, sin embargo, si reduciría la velocidad * tanto * en comparación con cuánto aceleraría las cosas para no tener que retroceder y dividir todos los objetos en líneas separadas, o enloquecer con la ventana inmediata para descubrir qué objeto es nulo? –

+0

De acuerdo en que este problema no es tan engorroso. La una o dos líneas antes de la que tuvo lugar la excepción de referencia nula le dirá exactamente qué no se está inicializando. –

1

porque es la forma más genérica de decir eso.

2

Para mí, esto parece ser puramente una cuestión de preferencia. Si te molesta tanto, siempre puedes subclasificar el NullReferenceException y cambiar el mensaje. :)

Lo que se reduce a embargo es la cantidad de información disponible cuando se crea el mensaje. Sin pasar manualmente información adicional, simplemente determinar el nombre del campo que era nulo dentro del NullReferenceException requeriría una reflexión (posiblemente bastante), que es una operación bastante pesada. Tomemos por ejemplo el ArgumentNullException, para arrojar uno en el que el mensaje indique el nombre del parámetro infractor, debe pasar una cadena cuando lo llame: throw new ArgumentNullException("param1").

El nivel de detalle en un mensaje de excepción depende enteramente del programador que lo define, pero es prudente evitar hacer todo el sistema intensivo al lanzar una excepción.

+0

Estoy bastante seguro de que el marco arroja la NullReferenceException. – ChaosPandion

+0

Sí, pero siempre se puede 'try {} catch (NullReferenceException e) {throw new CoolerNullReferenceException (e)}' o algo por el estilo. –

+0

Ah, acabo de notar el emoticón en su respuesta. :) – ChaosPandion

Cuestiones relacionadas