c#中的布尔属性
Posted
技术标签:
【中文标题】c#中的布尔属性【英文标题】:Boolean properties in c# 【发布时间】:2011-12-26 13:44:22 【问题描述】:这可能是一个愚蠢的问题,但是下面的属性,是否会出现仅获取它就会导致异常的情况?
如果我做了类似bool value = this.BatchValuation;
的操作——但我还没有设置BatchValuation
,它会只是将value
设置为null
,还是会导致异常?
public bool BatchValuation get; set;
【问题讨论】:
msdn.microsoft.com/en-us/library/83fhsxwc.aspx 【参考方案1】:有一次我遇到了一个非常奇怪的情况,当像这样的自动实现的属性抛出 NullReferenceException
异常时。原因是 Emit Mappper 库 (http://emitmapper.codeplex.com/)。
这个库(否则非常好)使用Refleciton.Emit,当它没有看到该类型的公共构造函数时,它会发出映射调用站点,它将空引用作为属性/方法的隐含第一个参数传递(最终在所有实例方法中作为“this”)。
所以该属性试图更改空引用的字段值(即我有this==null
的情况)!
【讨论】:
【参考方案2】:正如 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;
【讨论】:
【参考方案3】:这可能是个愚蠢的问题
不是。
在下面的属性中,会不会出现刚拿到就会引发异常的情况?
可能,是的。例如,另一个线程可以在获取该属性的过程中中止您的线程;这似乎是属性 getter 抛出的异常。或者,您可能会在调用该属性的那一刻用完堆栈空间,并且可能会引发堆栈外异常。或者,当您第一次调用该属性时,可能会启动抖动并尝试为生成的代码分配虚拟内存,但您的虚拟地址空间已满,因此可能会引发内存不足的异常。
这些都是极不可能的,但它们都是可能的。你问是否曾经会出现这种情况,而不是可能。
如果我还没有设置 BatchValuation,是只是将 value 设置为 null,还是会导致异常?
都不是;它将默认为 false。布尔值不可为空。
【讨论】:
这确实是我要问的,所以你得到了答案。【参考方案4】:在类属性或成员字段的上下文中,每个字段在创建类时被初始化为类型的默认值在运行构造函数之前。在课堂上
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
【讨论】:
【参考方案5】:如果您没有专门设置布尔值,则默认为 false。所以不会不会有异常,该属性只会返回false。
记住这是我们所说的值类型,只有引用类型的变量才能设置为null
。值类型确实有一个默认值,数值类型为零,布尔类型为 false。
另见Default Values Table
【讨论】:
好吧,完美,这就是我想我只是想确定的。 自动属性,例如 得到;放;为您生成字段,这些字段包含默认值,如果是布尔值,则默认为 false(您可以使用 default(sometype) 找出该类型的默认值)【参考方案6】:不,布尔值默认为 false。所以
bool something; // something is false
【讨论】:
以上是关于c#中的布尔属性的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 窗体 C# 中单击按钮通过 DataGridView 更新数据库中的布尔字段
编写高质量代码改善C#程序的157个建议——建议135: 考虑使用肯定性的短语命名布尔属性