2011-05-31 20 views
31
int n == 0; 

if (n == null)  
{ 
    Console.WriteLine("......"); 
} 

¿Es cierto que el resultado de la expresión (n == 0) siempre es falsa desde un valor de tipo int no es igual a null de tipo int?¿Por qué el tipo "int" nunca es igual a "nulo"?

+7

¿Porque int es un tipo de valor ...? – BoltClock

+2

¿Por qué una pregunta sobre C# puede duplicarse si la respuesta sugerida es para JAVA? –

+1

@ Matías: Creo que tiene sentido porque .NET y Java tienen muchas similitudes, y en este caso es el mismo concepto con una terminología ligeramente diferente (tipo primitivo vs valor). Y cuando vota para cerrar, elige 1 de 5 razones, y no todos los votos tienen que tener el mismo motivo. –

Respuesta

57

Si desea que su variable entera para permitir valores nulos, os lo hará ser un nullable type: Nota

int? n = 0; 

la ? después int, lo que significa que el tipo puede tener el valor null. Los tipos anulables se introdujeron con la versión 2.0 de .NET Framework.

+0

Alternativamente (aunque me gusta el taquigrafía '?' post-fix mejor) hay ['Nullable '] (http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx). - EDITAR: Además, ahora puede hacer referencia a (en este ejemplo) 'n.Value' o usar short-hand' int m = n ?? default (int); '(o lo que sea que elija ser el valor predeterminado) [syntactical sugar for' int m = (n.HasValue? n.Value: default (int)); '] –

+4

@Brad true-I'd be desperdiciando gran parte de mi vida si no usara la abreviatura '?'. – RedFilter

+0

@Brad: hay 'n.GetValueOrDefault()' también en lugar de usar '??' – thecoop

3

Porque int es un tipo de valor en lugar de un tipo de referencia. La especificación del lenguaje C# no permite que un int contenga nulo. Intente compilar esta declaración:

int x = null ; 

y vea lo que obtiene.

Obtiene la advertencia del compilador porque es una prueba inútil y el compilador lo sabe.

2

Los "tipos de valor" en .NET (como int, double y bool) no pueden, por definición, ser nulos: siempre tienen un valor real asignado. Para una buena introducción a los tipos de valor frente a los tipos de referencia, consulte http://www.albahari.com/valuevsreftypes.aspx

10

En C# no se permite el uso de una variable no inicializada.

Así

int i; 
Console.Writeline(i); 

resultados en un error de compilación.

Puede inicializar int con nuevos tales como:

int anInt = new int(); 

Esto dará lugar a la Default value para int que es 0. En los casos en que no desean tener un genérico int uno puede hacer que el int anulable con la sintaxis

int? nullableInt = null; 
+0

¿Por qué el voto a favor? Es importante señalar cómo funciona la inicialización en términos de nulability. Ninguna otra respuesta hizo esto. Especialmente teniendo en cuenta la ambigüedad de la pregunta. Necesitamos asegurarnos de que todo el terreno esté cubierto para el OP y las personas futuras que tengan esta pregunta general. –

+0

Bajé la votación porque la inicialización ni siquiera era un problema (aunque, curiosamente, la inicialización del OP no se compilará). En ese momento, eso es lo que percibí que era el punto de tu respuesta, y pensé que fuera del tema. Mi voto parece estar bloqueado, sin embargo. –

+0

@Jeol B Fant - Noté que la inicialización de OP no compilará. Eso es lo que me hizo pensar en publicar esta respuesta que explica la inicialización y los nulos en lo que respecta a C# lang. –

0

El uso de NULL se aplica a Punteros y referencias en general. Un valor 0 asignado a un entero no es nulo. Sin embargo, si puede asignar un puntero al entero y asignarlo a NULL, la declaración es válida.

En resumen =>

/*Use the keyword 'null' while assigning it to pointers and references. Use 0 for integers.*/ 
1

Muy simplemente, un int es un elemento muy básico. Es pequeño y simple para que pueda manejarse rápidamente. Se maneja como el valor directamente, no a lo largo del modelo de objeto/puntero. Como tal, no hay ningún valor legal "NULO" para que tenga. Simplemente contiene lo que contiene. 0 significa a 0. A diferencia de un puntero, donde es 0 sería NULL. Un objeto que almacena un 0 tendría un puntero distinto de cero.

Si tiene la oportunidad, tómese el tiempo para hacer un poco de trabajo de ensamblaje o de la vieja escuela, se volverá mucho más claro.

0

No, porque int es un tipo de valor.int es Value tipo Date, double, etc. Así que no hay manera de asignar un valor de null.

Cuestiones relacionadas