C#中的默认布尔值是什么?


82

布尔值(bool)不能为null。和:

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

为什么默认值不为false?那么,如果它不为空,那么值是多少呢?是什么原因?

编辑1-默认值的确为false-但所有变量都应初始化,为什么?这是另一个问题;)

编辑2-使用Resharper:private bool foo = false; // Initializing field by default value is redundant???


Answers:


101

http://msdn.microsoft.com/zh-CN/library/83fhsxwc.aspx

请记住,不允许在C#中使用未初始化的变量。

bool foo = new bool();

foo将具有默认值。

布尔默认值为false


1
抱歉,补充:请记住,不允许在C#中使用未初始化的变量。如链接文章所述
析构

1
谢谢!以及如何解释我的“编辑2” :)
JohnJohnGa 2011年

1
如果调用默认构造函数,则将设置默认值。您刚刚使用值初始化了一个新变量。“ int i”将引发相同的错误-使用未分配的局部变量-。在初始化时设置值或调用默认构造函数。这样您就不会有任何问题:)
析构

1
@Destructor我认为您的评论有点令人困惑。resharper表示OP不必初始化布尔字段的原因是因为类中的字段会自动分配其默认值,而局部变量则没有。请参阅下面来自Hasan答案
Alex

25

基本上,局部变量不会自动初始化。因此,不初始化就使用它们会导致异常。

只有以下变量会自动初始化为其默认值:

  • 静态变量
  • 类和结构实例的实例变量
  • 数组元素

默认值如下(在类的默认构造函数中分配):

  • 引用类型的变量的默认值为null。
  • 对于整数类型,默认值为0
  • 对于char,默认值为`\ u0000'
  • 对于float,默认值为0.0f
  • 对于double,默认值为0.0d
  • 对于十进制,默认值为0.0m
  • 对于布尔值,默认值为false
  • 对于枚举类型,默认值为0
  • 对于结构类型,通过将所有值类型字段设置为其默认值来获取默认值

就问题的后续部分而言:

  • 所有未自动初始化为默认值的变量都应初始化的原因是编译器施加的限制。
  • 私人布尔foo = false; 实际上这是多余的,因为这是一个类的实例变量。因此,它将在默认构造函数中初始化为false。因此,无需将其设置为伪造自己。

4
为了完整起见,MSDN默认值表表示结构类型的默认值还包括将“所有引用类型字段设置为null”。
卡尔·沃尔什

10

默认值的确为false。

但是,您不能使用局部变量,因为它不是首先分配的。

您可以使用默认关键字来验证:

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



0

从编译器可以将其视为防御性编程方法-必须先分配变量,然后才能使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.