¿Cuál es el valor booleano predeterminado en C #?

82

Un booleano ( bool) no puede ser nulo. Y:

bool foo; if(foo){} // Use of unassigned local variable 'foo'

¿Por qué el valor predeterminado no es falso? Entonces, ¿cuál es el valor si no es nulo? ¿Cuál es la razón?

Edición 1: el valor predeterminado es falso, pero todas las variables deben inicializarse, ¿por qué? esto es para otra pregunta;)

Edición 2 - con Resharper: private bool foo = false; // Initializing field by default value is redundant???

JohnJohnGa
fuente
1
Puede encontrar interesante blogs.msdn.com/b/ericlippert/archive/2009/10/12/…
AakashM

Respuestas:

101

http://msdn.microsoft.com/en-us/library/83fhsxwc.aspx

Recuerde que no se permite el uso de variables no inicializadas en C #.

Con

bool foo = new bool();

foo tendrá el valor predeterminado.

El valor booleano predeterminado es falso

Incinerador de basuras
fuente
1
Lo sentimos, agregado: recuerde que el uso de variables no inicializadas en C # no está permitido. Como se ve en el artículo vinculado
Destructor
1
¡Gracias! y entonces, ¿cómo puedes explicar mi "Edición 2" :)
JohnJohnGa
1
el valor predeterminado se establecerá si se llama al constructor predeterminado. Acaba de inicializar una nueva variable con un valor. "int i" arrojará el mismo error -Uso de variable local no asignada-. Establezca el valor en la inicialización o llame al constructor predeterminado. para que no tengas ningún problema :)
Destructor
1
@Destructor Creo que tu comentario es un poco confuso. La razón por la que resharper sugiere que OP no tiene que inicializar el campo booleano es porque a los campos de una clase se les asigna automáticamente su valor predeterminado, lo que no ocurre con las variables locales. Vea la respuesta de Hasan a continuación.
Alex
25

Básicamente, las variables locales no se inicializan automáticamente. Por lo tanto, usarlos sin inicializar resultaría en una excepción.

Solo las siguientes variables se inicializan automáticamente a sus valores predeterminados:

  • Variables estáticas
  • Variables de instancia de instancias de clase y estructura
  • Elementos de matriz

Los valores predeterminados son los siguientes (asignados en el constructor predeterminado de una clase):

  • El valor predeterminado de una variable de tipo de referencia es nulo.
  • Para los tipos enteros, el valor predeterminado es 0
  • Para char, el valor predeterminado es `\ u0000 '
  • Para flotante, el valor predeterminado es 0.0f
  • Para el doble, el valor predeterminado es 0.0d
  • Para decimal, el valor predeterminado es 0.0 m
  • Para bool, el valor predeterminado es falso
  • Para un tipo de enumeración, el valor predeterminado es 0
  • Para un tipo de estructura, el valor predeterminado se obtiene estableciendo todos los campos de tipo de valor en sus valores predeterminados

En lo que respecta a las partes posteriores de su pregunta:

  • La razón por la que todas las variables que no se inicializan automáticamente a los valores predeterminados deben inicializarse es una restricción impuesta por el compilador.
  • private bool foo = false; De hecho, esto es redundante ya que es una variable de instancia de una clase. Por lo tanto, esto se inicializaría en falso en el constructor predeterminado. Por lo tanto, no es necesario configurar esto como falso.
Hasan Fahim
fuente
4
Para completar, la tabla de valores predeterminados en MSDN dice que los valores predeterminados para los tipos de estructuras también incluyen establecer "todos los campos de tipo de referencia en nulos".
Carl Walsh
10

El valor predeterminado es de hecho falso.

Sin embargo, no puede usar una variable local si no se asignó primero.

Puede utilizar la palabra clave predeterminada para verificar:

bool foo = default(bool);
if (!foo) { Console.WriteLine("Default is false"); }
Petar Ivanov
fuente
4

El valor predeterminado de bool es false. Consulte esta tabla para obtener una excelente referencia sobre los valores predeterminados. La única razón por la que no sería falso cuando lo verifique es si lo inicializa / establece en verdadero.

Corey Larson
fuente
0

Pruebe esto (usando la palabra clave predeterminada)

 bool foo = default(bool); if (foo) { } 
TalentTuner
fuente
0

Puede tratarse como un enfoque de programación defensiva del compilador: las variables deben asignarse antes de que se pueda usar.

Ajay
fuente