2012-09-21 25 views
32

Tengo un valor entero y debo verificar si es NULO o no. Tengo que usar un nulo-coalescencia operadorComprueba que un valor entero sea nulo en C#

C#:

public int? Age; 

if ((Age ?? 0)==0) 
{ 
    // do somethig 
} 

ahora tengo que comprobar en una solicitud más antigua en la parte de declaración no está en ternaria. Entonces, cómo lograr esto sin el operador de fusión nula.

+2

Pruebe 'Age.HasValue'. –

+2

Un punto en la nomenclatura: '??' un operador nulo-coalescente. 'SomeValueType?' Es un tipo que admite nulos. – spender

+0

@ AdamHouldsworth ¡Intenta responder como una respuesta normal! –

Respuesta

80

Nullable<T> (o ?) expone una bandera HasValue para denotar si se establece un valor o si el elemento es nulo.

Además, los tipos anulables apoyar ==:

if (Age == null)

El ?? es el operador coalescente nula y no da lugar a una expresión booleana, sino un valor devuelto:

int i = Age ?? 0; 

Así para su ejemplo:

if (age == null || age == 0) 

O:

if (age.GetValueOrDefault(0) == 0) 

O:

if ((age ?? 0) == 0) 

O ternarios:

int i = age.HasValue ? age.Value : 0; 
+9

Buena respuesta; Sin embargo, func: la 'age.GetValueOrDefault()' sin parámetros es marginalmente más rápida - omite por completo * la comprobación "¿Tengo un valor?", y simplemente devuelve el campo de valor - que tendrá el valor predeterminado (T) ', aka' 0'. –

+0

@MarcGravell Cool, pero a los efectos de la respuesta elegí ser explícito. –

+0

@RFEPetr Sí, eso está en la respuesta. –

10

varias cosas:

Age no es un entero - es un anulable tipo número entero . Ellos no son los mismos. Consulte la documentación para Nullable<T> en MSDN para obtener más información.

?? es el null coalesce operator, no el operador ternario (en realidad llamado conditional operator).

Para comprobar si un tipo anulable tiene un valor de uso HasValue, o detectar directamente contra null:

if(Age.HasValue) 
{ 
    // Yay, it does! 
} 

if(Age == null) 
{ 
    // It is null :(
} 
1

ya hay una respuesta correcta de Adán, pero usted tiene otra opción que refactorizar su código:

if (Age.GetValueOrDefault() == 0) 
{ 
    // it's null or 0 
} 
0

Como se indicó anteriormente, ?? es el operador coalescente nulo. Por lo que el equivalente a

(Age ?? 0) == 0 

sin utilizar el operador ?? es

(!Age.HasValue) || Age == 0 

Sin embargo, no hay una versión de.Red que tiene Nullable< T > pero no ??, por lo que su estado de cuenta,

ahora tengo que comprobar en una solicitud más antigua en la parte de declaración no está en ternaria.

es doblemente inválido.

1

Simplemente se puede hacer esto:

public void CheckNull(int? item) 
    { 
     if (item != null) 
     { 
      //Do Something 
     } 

    } 
Cuestiones relacionadas