2010-04-23 23 views
15

Me pregunto qué significa ? en C#?
Estoy viendo cosas como: DateTime? o int?. ¿Supongo que esto es específico de C# 4.0?
No puedo buscarlo en Google porque no sé el nombre de esta cosa.
El problema es que estoy usando DateTime y tengo un montón de errores de conversión (desde DateTime hasta DateTime?).C# - Pregunta básica: ¿Qué es '?'?

Gracias

+9

No es nuevo; estado alrededor desde .NET 2.0. – Randolpho

+0

No debe confundirse con el operador tradicional C if-then-else, x <0? "-": "+" – Qwertie

Respuesta

33

Es una forma abreviada de escribir Nullable<int> o Nullable<DateTime>. Nullables se usan con value types que no pueden ser nulos (siempre tienen un valor).

No es específico de C# 4 por cierto.

Sólo se puede asignar una int? a un int si tiene un valor, por lo que su código tendría que hacer cosas como:

int? n = 1; 
int i = n ?? default(int); //or whatever makes sense 

También tenga en cuenta que un Nullable tiene dos propiedades, HasValue y Value que puede usar la prueba si se ha establecido un valor y obtener el valor real.

+3

int i = n ?? predeterminado (int); –

+0

@Brian Gideon, tienes toda la razón, solo quería ilustrar que un Nullable tiene esas dos propiedades. –

+0

@klausbyskov: Está bien señalar esas propiedades, pero las has dado en un ejemplo en el que son una mala elección; tal vez podrías anotarlas por separado y usar '??' para la asignación a 'int' . –

12

Significa que es nullable type.

Le permite asignar un valor nulo a los tipos de valor como int y DateTime. Es muy útil con cosas como campos opcionales en una base de datos.

5

El ? es un tipo de valor anulable.

Usted puede utilizar el operador ?? mezclarlo con los tipos de valor:

const int DefaultValue = -1; 

// get a result that may be an integer, or may be null 
int? myval = GetOptionalIdFromDB(); 

// the value after ?? is used if myval is null 
int nonNullable = myval ?? DefaultValue; 

El tipo anulable puede ser comparado con nula, por lo que la anterior es la abreviatura de:

if(myval != null) { 
    nonNullable = myval.Value; 
} else { 
    nonNullable = DefaultValue; 
} 

pero yo prefiero ??

1

A tengo que tener en cuenta: [Editar: aparentemente esto solo sucede a veces]

// nullable type properties may not initialize as null 
private int? foo; // foo = 0 

// to be certain, tell them to be null 
private int? foo = null; 
+0

Esa no es mi experiencia: ¿Puedes publicar una reproducción completa con un método principal y todo? De esta manera: clase estática Programa { private static int? yo; public static void Main() { Console.WriteLine (i); } } –

+0

En realidad, tienes razón ... cuando realizo una prueba directa en Snippet Compiler, se inicializa a nulo. Cuando escribí el código en un código subyacente de la página, accediendo a las propiedades de otra clase sellada pública, los he visto inicializarse a medida que su valor predeterminado. Tendré que cavar más profundo para descubrir cuándo/por qué sucede eso. -1 de mí mismo! – Matt

1

Es una forma abreviada de declarar una implementación de la clase genérica Nullable<T>, donde T es un tipo de valor que no admite nulos.

Así

int? i = null; 

es lo mismo que

Nullable<int> i = null; 

Como se mencionó anteriormente Nullable<T> expone la propiedad HasValue para que pueda comprobar si i tiene un valor antes de trabajar en él.

Es interesante notar: Si lanzas Nullable<int> i = 3; a un objeto, puedes devolverlo a un int o a Nullable<int> porque tenía un valor antes del boxeo. Si, sin embargo, echaste Nullable<int> i = null; a un objeto, obtendrás una NullReferenceException cuando lances de nuevo a un int, pero puedes devolverla a un Nullable<int>.

1

Como han dicho otros, después del nombre de un tipo significa el tipo que admite nulo.

? también se usa en el operador de condición.

int max = x > y ? x : y 

Esto es equivalente a:

int max; 
if(x > y) 
{ 
    max = x; 
} 
else 
{ 
    max = y; 
}