Duplicar posibles:
What's the difference between 'int?' and 'int' in C#?Explicación de int? vs int
me he encontrado con algo de código en C# que declara una variable como: int? number
¿Qué significa el ?
y cómo lo hace esto difiere de solo: int
Duplicar posibles:
What's the difference between 'int?' and 'int' in C#?Explicación de int? vs int
me he encontrado con algo de código en C# que declara una variable como: int? number
¿Qué significa el ?
y cómo lo hace esto difiere de solo: int
int
no puede ser null
.
int?
es un alias para la estructura Nullable<int>
, que puede establecer en null
.
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.
También puede utilizar el valor normal '== null' comprobar en lugar de' HasValue'. –
Un signo de interrogación detrás de la declaración significa que la variable es anulable.
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.
int? puede ser nulo donde no puede int.
tipos de referencia anulables: http://msdn.microsoft.com/en-us/library/1t3y8s4s(v=VS.100).aspx
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;
Tenga en cuenta que 'int?' Es * también * un tipo de valor aunque ... que contradice la "definición" de su primera oración ... –
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. –
No puede establecer int? nulo, pero puedes asignarle nulo :) –