2009-07-25 22 views
47

Utilizo el tipo "bool" para variables como estaba acostumbrado en C++, e intento poner los valores de las funciones o propiedades que espero sean booleanas en mi variable. Sin embargo, a menudo encuentro casos en los que el tipo de resultado es "bool". y no "bool" y el lanzamiento implícito falla.¿Cuál es la diferencia entre "bool" y "bool?"?

¿Cuál es la diferencia entre los dos y cuándo se usa cada uno? Además, ¿debería usar "bool"? como el tipo de mi variable? ¿Es esta la mejor práctica?

+0

posible duplicado de [¿Qué significa "DateTime?" significa en C#?] (http://stackoverflow.com/questions/109859/what-does-datetime-mean-in-c) – nawfal

Respuesta

79

El símbolo ? después de un tipo es solo un acceso directo al Nullable type, bool? es equivalente a Nullable<bool>.

bool es una value type, esto significa que no puede ser null, por lo que el tipo anulable básicamente le permite envolver los tipos de valor, y ser capaz de asignar null a ellos.

bool? puede contener tres valores diferentes: true, false y null.

También, no hay operadores de cortocircuito (& & ||) definidos para bool?

Sólo la lógica AND, OR inclusivo, los operadores se definen y se comportan como este:

x  y  x & y x | y 
true true true true 
true false false true 
true null null true 
false true false true 
false false false false 
false null false null 
null true null true 
null false false null 
null null null null 

El tipo Nullable es básicamente una estructura genérica, que tiene las siguientes propiedades públicas:

public struct Nullable<T> where T: struct 
{ 
    public bool HasValue { get; } 
    public T Value { get; } 
} 

La propiedad HasValue indica si el objeto actual tiene un valor, y la propiedad Value obtendrá el valor actual del objeto, o si HasValue es falso, arrojará una InvalidOperationException.

Ahora debe estar preguntándose algo, Nullable es una estructura, un tipo de valor que no puede ser nulo, entonces ¿por qué la siguiente declaración es válida?

int? a = null; 

Ese ejemplo se compilará en esto:

.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0) 
IL_0000: ldloca.s V_0 
IL_0002: initobj valuetype [mscorlib]System.Nullable`1<int32> 

Una llamada a initobj, que inicializa cada campo del tipo de valor en una dirección especificada para una referencia nula o un 0 del tipo primitivo apropiado .

Eso es todo, lo que está sucediendo aquí es el predeterminado struct initialization.

int? a = null; 

es equivalente a:

Nullable<int> a = new Nullable<int>(); 
+2

Es una buena respuesta, pero ¿puedo sugerir que deje en claro que bool? también es un tipo de valor, es en realidad una estructura que contiene algo como {T value; bool _hasValue} – AnthonyWJones

+0

Gracias Anthony, extendí mi publicación un poco. – CMS

+0

Y '! ((Bool?) Null)' da como resultado 'null'. –

14

bool? es anulable, mientras bool no lo es.

bool? first; 
bool second; 

En el código anterior, first habrá null mientras second será false.

Un uso típico es si desea saber si se ha realizado una asignación a la variable. Desde bool es una valor de tipo (al igual que int, long, double, DateTime y algunos otros tipos), siempre va a ser inicializado a un valor predeterminado (false en el caso de un bool, 0 en el caso de un int) . Esto significa que no puede saber fácilmente si es false porque algún código le asignó false, o si es false porque aún no se le ha asignado. En ese caso, bool? es útil.

+7

Tenga en cuenta que esos valores predeterminados solo son válidos para las variables de instancia/estáticas, no para las variables locales. –

5

¿Cuando ves el? carácter después de un nombre de tipo, es abreviatura de Nullable<TypeName>. Nullable es un tipo especial que permite que los tipos de valores actúen como un valor nulo. Es una forma de expresar explícitamente que un tipo de valor puede tener un valor sin valor.

Para bool resulta efectiva la variable en un valor de tres estados

  • Con Valor: True
  • Con Valor: Falso
  • Sin Valor
2

bool sólo puede contener true y false valores, mientras que bool? también puede tener un valor de null.

3

bool? significa que boolean es anulable y es azúcar sintáctico para una estructura Nullable<bool>. Debido a que boolean es un tipo de valor, no puede establecerlo como nulo, pero hay algunos casos en los que le gustaría que le gustara en una clase de acceso a datos porque los campos de la base de datos pueden tener valores nulos.

4

Agregar ? hace que el tipo null-able. Lo que significa que puede hacer esto:

bool? x = null; 

Y estaría totalmente bien.

0

bool significa que puede tener valores de verdadero y falso. bool? significa que puede tener un valor de verdadero, falso y nulo.

Funciona para datetime y booleans.

1

Otro buen lugar para usar bool? está en un método para agregar comprobación nula

public bool? IsTurkeyStillInFridge(Turkey turkey) 
{ 
    if (turkey == null) 
    return null; 
    else if (fridge.Contains(turkey)) 
    return true; 
    else 
    return false; 
} 

bool? canStayAtDesk = IsTurkeyStillInFridge(turkey); 

if (canStayAtDesk == null) 
    MessageBox.Show("No turkey this year, check for ham."); 
else if (canStayAtDesk == true) 
    MessageBox.Show("Turkey for lunch. Stay at desk."); 
else 
    MessageBox.Show("Turkey's gone, go out to lunch."); 
Cuestiones relacionadas