c#中的布尔属性

时间:2011-11-10 21:46:54

标签: c# .net boolean

这可能是一个愚蠢的问题,但是下面的属性是否会出现这样的情况:只是获取它会导致异常?

如果我执行bool value = this.BatchValuation;之类的操作 - 但我尚未设置BatchValuation,那么它会将value设置为null,还是会导致异常?

public bool BatchValuation { get; set; }

6 个答案:

答案 0 :(得分:47)

  

这可能是一个愚蠢的问题

不是。

  

在下面的属性中,是否会出现导致异常的情况?

可能,是的。例如,另一个线程可以在获取该属性的过程中中止您的线程;这似乎是属性getter抛出的异常。或者,您可能在调用属性时立即耗尽堆栈空间,并且可能抛出堆栈外异常。或者,当您第一次调用该属性时,抖动可能会启动并尝试为生成的代码分配虚拟内存,但是您将全部脱离虚拟地址空间,因此可能会抛出内存不足异常。

这些都非常不可能,但它们都是可能的。你问过曾经是否会出现这种情况,而不是可能

  

如果我还没有设置BatchValuation,它会将value设置为null,还是会导致异常?

既不;它将默认为 false 。布尔人不可空。

答案 1 :(得分:24)

如果没有专门设置它们,则

布尔值默认为false。所以不会有任何例外,该属性只会返回false。

请记住,这是我们所讨论的值类型,只有参考类型的变量可以设置为null。值类型确实有一个默认值,对于数字类型为零,对于布尔值为false。

另见Default Values Table

答案 2 :(得分:3)

不,布尔值默认为false。所以

bool something; // something is false

答案 3 :(得分:2)

类属性或成员字段的上下文中,当为正在运行的构造函数创建类之前时,每个字段都初始化为该类型的默认值。在课堂上

class Foo
{
    bool bar;
    string s;
    int item;
    public double Baz { get; set; } 
}

前三个字段设置为其初始值(分别为false,null和0),Baz的自动生成的后备字段也设置为0.0d。与未访问未初始化的本地人不同,在没有显式用户初始化的情况下访问这些字段/属性不是错误。对于本地人来说,编译器需要显式初始化。

class Foo
{
   int bar;

   void M()
   {
       Console.WriteLine(bar); // not an error, bar is 0;
       bool someBool;
       Console.WriteLine(someBool); // use of uninitialized local variable
   }
}

答案 4 :(得分:0)

正如BrokenGlass所说,布尔值默认为false,

你可以自己测试,我提供如下样本。

    static void Main()
    {
        // Create an object, but don't set attribute.
        Foo foo = new Foo();

        if (!foo.BatchValuation)
            Console.WriteLine("BatchValuation is False");

        else
            Console.WriteLine("BatchValuation is True");

        Console.ReadKey();

    }

}


// Test class.
public class Foo
{
    private bool _batchValuation;
    public Foo() { }
    public bool BatchValuation 
    {
        get { return _batchValuation; }
        set { _batchValuation = value; }
    }
}

答案 5 :(得分:0)

一旦我有一个非常奇怪的情况,当像这样的自动实现的属性引发NullReferenceException异常。原因是Emit Mappper库(http://emitmapper.codeplex.com/)。

这个库(否则非常好)使用Refleciton.Emit,当它看不到该类型的公共构造函数时,它会发出映射调用站点,它将null引用作为属性/方法的隐含的第一个参数传递(最终在所有实例方法中都是“this”)。

所以该属性试图改变空引用的字段值(也就是说,我有this==null情况)!