c# - valor - excepción no controlada del tipo system nullreferenceexception
¿Qué es nulo en c#, java? (9)
Como Java y C # se ejecutan en máquinas virtuales, no importa qué se use físicamente para representar nulo, y no es necesariamente el mismo en todas las implementaciones.
Lo que importa es el comportamiento de nulo, como se define en la especificación del lenguaje (ver las respuestas de Dan y MRFerocius para más detalles). Básicamente, es un valor especial que las variables de tipo de referencia pueden contener, y que no se puede desreferenciar.
Por cierto, como punto de referencia, la especificación de serialización de Java usa un valor de byte único 0x70 para representar una referencia nula.
Me gusta ... ¿es 0
como en C ++? ¿O es un objeto "especial"? O tal vez algo totalmente diferente?
- EDITAR -
Sé lo que es , la pregunta es más bien: cómo se hace
De Microsoft MDSN:
La palabra clave null es un literal que representa una referencia nula, una que no se refiere a ningún objeto. null es el valor predeterminado de las variables de tipo de referencia. Los tipos de valores ordinarios no pueden ser nulos. Sin embargo, C # 2.0 introdujo tipos de valores que aceptan nulos. Consulte Tipos anulables (Guía de programación C #).
Es una referencia especial (para diferenciarlo de 0) que apunta a nada.
Esto es nulo en C #
Null es literalmente nada. Algunos lenguajes como PHP igualarán nulo a 0, falso, cadena vacía, etc. bajo ciertas circunstancias. Java y C # son lenguajes fuertemente tipados. Por lo tanto, ninguna de esas conversiones implícitas "útiles" tiene lugar. Tan nulo es literalmente nulo o nada. Null solo es igual a nulo. Ninguna otra comparación será verdadera.
Ya que está preguntando sobre los detalles de la implementación, en lugar de la semántica, la respuesta es específica para una implementación determinada.
Hay tres cosas en C # que pueden ser "nulas". Una referencia, un puntero y un tipo anulable.
La implementación de C # en el CLR representa una referencia nula por bits cero. (Donde el número de bits es el tamaño apropiado para ser un puntero administrado en la versión particular del CLR que está ejecutando).
Como era de esperar, un puntero nulo se representa de la misma manera. Puede demostrar esto en C # haciendo un bloque inseguro, convirtiendo un puntero nulo en vacío, y luego convirtiéndolo en IntPtr, y luego convirtiendo IntPtr en int (o largo, en sistemas de 64 bits). Efectivamente, obtendrás cero.
Un tipo de valor anulable nulo también se implementa mediante ceros, aunque de una manera diferente. Cuando tu dices
¿En t? j = nulo;
lo que realmente creamos es el equivalente moral de:
struct NullableInt
{
int value;
bool hasValue;
}
Con los métodos de acceso apropiados, y así sucesivamente. Cuando a una de esas cosas se le asigna nulo, simplemente llenamos todo con cero bits. El valor es el entero cero, y hasValue se llena con ceros y por lo tanto se convierte en falso; un tipo anulable con el campo hasValue establecido en falso se considera nulo.
No sé cuáles son los detalles de implementación en otras implementaciones de C # / CLI. Me sorprendería si fueran diferentes; esta es la forma obvia y sensata de implementar nulos. Pero si tiene preguntas sobre un detalle de implementación específico, tendrá que preguntarle a alguien que sepa sobre la implementación que le interesa.
es equivalente a
#define NULL (void*)0
en c ++. Entonces, básicamente, sí, es cero.
EDITAR: Ya que aparentemente no dije esta respuesta en ninguna parte cerca de la correcta ...
Lo que quise decir es esto:
Como C # se ejecuta en una VM, lo que Michael Borgwardt dijo es correcto, no sabemos cómo se representa detrás de las escenas. Sin embargo, si toma el siguiente código:
unsafe static void Main(string[] args)
{
if (((void*)0) == null)
Console.WriteLine("true");
else
Console.WriteLine("false");
Console.ReadKey();
}
y compilarlo en una aplicación de consola, con "Permitir código no seguro" habilitado, verá que en c #, null es de hecho igual a (vacío *) 0.
null es una "referencia" a nada, por lo que apunta literalmente a nada.
Información adicional: el tipo de referencia de AC # puede señalar nulo (es decir, nada), un tipo de valor como int no puede apuntar a nulo, aunque se puede usar un tipo de valor en el tipo de referencia genérico Nullable.
Especificación del lenguaje Java sección 4.1 :
También hay un tipo nulo especial, el tipo de la expresión null, que no tiene nombre. Como el tipo nulo no tiene nombre, es imposible declarar una variable del tipo nulo o convertir al tipo nulo. La referencia nula es el único valor posible de una expresión de tipo nulo. La referencia nula siempre se puede convertir a cualquier tipo de referencia. En la práctica, el programador puede ignorar el tipo nulo y simplemente pretender que nulo es simplemente un literal especial que puede ser de cualquier tipo de referencia.