2011-11-10 199 views
22

这可能是一个愚蠢的问题,但下面的属性,会不会有一种情况,只是得到它会导致异常?c#中的布尔属性#

一样,如果我不喜欢的东西bool value = this.BatchValuation; - 但我还没有设置BatchValuation的是,将它刚刚成立valuenull,还是会导致异常?

public bool BatchValuation { get; set; } 
+3

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

回答

37

这可能是一个愚蠢的问题

它不是。

在下面的属性中,是否会有这样一种情况,只是得到它会导致异常?

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

这些都是非常不可能的,但他们都是可能。你问过有没有会出现这种情况,如果是可能是

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

两者都不;它将默认为虚假。布尔值不能为空。

+1

这真是我的问,所以你得到答案。 – slandau

22

如果没有专门设置它们,布尔值默认为false。所以不会有任何例外,财产只会返回false。

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

另见Default Values Table

+0

好的完美这是我以为我只是想确保。 – slandau

+0

自动属性例如{get;组; }为你生成这些字段,这些字段包含默认值,如果是布尔值,默认值为false(你可以使用default(sometype)来找出默认的类型) – BlackTigerX

3

没有,布尔默认为false。所以

bool something; // something is false 
2

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

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

前三个字段(分别为假,空值和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 
    } 
} 
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; } 
    } 
} 
0

一旦我有一个非常奇怪的情形下,当自动实现的属性像这样扔了NullReferenceException例外。原因是Emit Mappper库(http://emitmapper.codeplex.com/)。

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

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