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#中的布尔属性的主要内容,如果未能解决你的问题,请参考以下文章

C#中的原始布尔大小

可空布尔作为 C# 中的三态变量

如何在 Windows 窗体 C# 中单击按钮通过 DataGridView 更新数据库中的布尔字段

编写高质量代码改善C#程序的157个建议——建议135: 考虑使用肯定性的短语命名布尔属性

C#的EF中的字段类型布尔型,mysql数据库里是bit类型,提交识别不了该字段赋的true和false,为啥呢?

前端中的attr和prop的区别