2011-06-17 36 views

Respuesta

16

int no puede ser null.

int? es un alias para la estructura Nullable<int>, que puede establecer en null.

+7

Tenga en cuenta que 'int?' Es * también * un tipo de valor aunque ... que contradice la "definición" de su primera oración ... –

+0

Todavía no estoy de acuerdo con su primera oración, ya que 'int?' Es un tipo de valor con un valor nulo Luego habla de que un "objeto" es nulo, mientras que un * objeto * nunca es nulo, solo una referencia es ... y un valor de tipo de valor no es un objeto de todos modos. –

+0

No puede establecer int? nulo, pero puedes asignarle nulo :) –

4

Es sintáctico compilador de azúcar para Nullable<int>

Básicamente su número (o cualquier otro tipo de valor) puede ser nulo, así como su valor. Verifica un valor utilizando la propiedad HasValue. Se pueden convertir en sus tipos de valor (aunque esto fallará si son nulos) o puede usar la propiedad Value (otra vez lanzará una excepción si es nula)

Una cosa que generalmente parece ser pasada por alto cuando se usan tipos con nulos es el método GetValueOrDefault() que devuelve el valor predeterminado (T) si el objeto es nulo.

Como señala @Kyle Trauberman en el comentario, puede compararlo con nulo en lugar de comprobar HasValue. El tipo en sí mismo es un tipo de valor con métodos de igualdad anulados, por lo que, dado que nunca será nulo, devolverá verdadero cuando se compara con nulo si no tiene un valor.

+0

También puede utilizar el valor normal '== null' comprobar en lugar de' HasValue'. –

3

Un signo de interrogación detrás de la declaración significa que la variable es anulable.

5

int? es la abreviatura de Nullable<int> que le permite simular que un entero puede manejar valores nulos.

int? foo = null; 

Es útil para indicar una falta de valor en el que previamente habría utilizado un valor mágico (-1) en el pasado, y también es útil cuando se trata de columnas de base de datos que permiten entradas nulas.

Para un aspecto cuasi en profundidad, un Nullable<T> (introducido en .NET 2.0) es simplemente una envoltura sobre un valor de tipo de T que expone dos propiedades, HasValue y Value, donde HasValue es un valor booleano que indica si el valor se ha establecido y Value (obviamente suficiente) devuelve el valor. Es un error acceder a Value si HasValue es falso. Por lo tanto, para acceder a Value, es buena forma verificar primero HasValue. Además, si simplemente desea normalizar valores que no sean valores a valores predeterminados (0 para tipos numéricos), puede utilizar el método GetValueOrDefault() sin necesidad de marcar HasValue.

en cuenta que aunque usted aparece para establecer foo a null, no es en realidad nula bajo situaciones de uso normales. null es simplemente azúcar sintáctica adicional para este tipo.La línea de código anterior se traduce en

Nullable<int> foo = new Nullable<int>(); 

Inicializar la variable de esta manera simplemente establece la propiedad HasValue a falso.

Sin embargo, en situaciones relacionadas con el boxeo, el valor realmente se ajustará a nulo si HasValue es falso (de lo contrario, boxeará a T). ¡Se consciente de las consecuencias! Por ejemplo, en:

int? foo = null; 
string bar = foo.ToString(); // this is fine, returns string.Empty 
Type type = foo.GetType(); // blows up! GetType causes the value to box 
          // resulting in a NullReferenceException 

Es un curso acelerado rápido. Para obtener más información, visite el documentation.

10

int? es una abreviatura para la creación de una instancia de la genérico System.Nullable<T> tipo de estructura. Le permite hacer que su variable sea nulable. Recuerde, dado que la sintaxis <ValueType>? es una forma rápida, se puede declarar sus variables así:

Nullable<int> i = 10;