这可能是一个愚蠢的问题,但是下面的属性是否会出现这样的情况:只是获取它会导致异常?
如果我执行bool value = this.BatchValuation;
之类的操作 - 但我尚未设置BatchValuation
,那么它会将value
设置为null
,还是会导致异常?
public bool BatchValuation { get; set; }
答案 0 :(得分:47)
这可能是一个愚蠢的问题
不是。
在下面的属性中,是否会出现导致异常的情况?
可能,是的。例如,另一个线程可以在获取该属性的过程中中止您的线程;这似乎是属性getter抛出的异常。或者,您可能在调用属性时立即耗尽堆栈空间,并且可能抛出堆栈外异常。或者,当您第一次调用该属性时,抖动可能会启动并尝试为生成的代码分配虚拟内存,但是您将全部脱离虚拟地址空间,因此可能会抛出内存不足异常。
这些都非常不可能,但它们都是可能的。你问过曾经是否会出现这种情况,而不是可能。
如果我还没有设置BatchValuation,它会将value设置为null,还是会导致异常?
既不;它将默认为 false 。布尔人不可空。
答案 1 :(得分:24)
布尔值默认为false。所以不会有任何例外,该属性只会返回false。
请记住,这是我们所讨论的值类型,只有参考类型的变量可以设置为null
。值类型确实有一个默认值,对于数字类型为零,对于布尔值为false。
答案 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
情况)!