c# .net vb.net

c# - "Referencia de objeto no establecida en una instancia de un objeto": ¿por qué no puede.NET mostrar más detalles?



vb.net (4)

¡No encontré esta excepción tan difícil de tratar!

Si conozco el número de línea. Simplemente inserto un punto de interrupción en esta línea, ejecuto la aplicación en esta línea, y cuando el depurador se detiene, paso todas las variables / objetos de la línea y, gracias a Visual Studio, me muestra sus valores.

También encontré la ventana Autos muy útil en tales casos, pero el procedimiento que describí anteriormente resuelve mi problema rápidamente.

" Referencia de objeto no establecida en una instancia de un objeto "

¿Por qué la excepción no muestra también el nombre del campo de referencia del objeto, o al menos su tipo?

Este es probablemente uno de los errores de tiempo de ejecución más comunes en .NET. Aunque la excepción System.Exception tiene un seguimiento de pila, no hay otros detalles útiles.

En el transcurso de un año, pasé horas revisando las huellas de la pila (a menudo en el código que no escribí), esperando que haya un número de línea de un archivo ".pdb", que luego encuentre la línea en el código, y aún así sea A menudo no es obvio qué referencia en la línea era nula. Tener el nombre del campo de referencia sería muy conveniente.

Si las instancias de System.ArgumentNullException pueden mostrar el nombre del parámetro del método ("El valor no puede ser nulo. Nombre del parámetro: valor "), entonces las instancias de System.NullReferenceException podrían incluir el nombre del campo nulo (o su colección que contiene).


A pesar de que el nombre y el tipo de variable pueden existir en el código MSIL, no existirá en el código nativo cuando la MSIL esté JITted.

Sería increíblemente ineficiente agregar este tipo de verificación al código nativo durante el JITting, esencialmente una sobrecarga cada vez que se hace referencia a un puntero.



La diferencia entre ArgumentNullException y NullReferenceException es que ArgumentNullException siempre se lanza explícitamente de esta forma:

if (parameter == null) throw new ArgumentNullException("parameter");

Si echamos un vistazo rápido a la salida de ILDASM, las variables locales están presentes dentro del IL de una función. Todavía no hay, sin embargo, API para recuperar esos nombres mediante programación. Mi entendimiento es que sería bastante complejo, ya que básicamente necesitarías construir un árbol de análisis que represente una función con ámbitos, variables, declaraciones, etc.

Se complica aún más por el hecho de que no solo las variables simples pueden NullReferenceException , sino el resultado de una llamada de función, una propiedad o una expresión. Podría ponerme bastante complicado bastante rápido.

Imagina esto:

internalObject.OtherProperty = myObject.GetOtherObject().ThirdObject.SomeProperty == "value" ? myObject.OtherProperty : myObject.GetSomethingElse();

Hay varios puntos de falla allí y crear una cadena que represente lo que en realidad es null podría ser complicado.