如何正确使用带有if语句的bool?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何正确使用带有if语句的bool?相关的知识,希望对你有一定的参考价值。

我有这个名为“DoStuff()”的方法,它的作用是检查复选框是否被检查,然后它们是否做了什么。

private void DoStuff()
{
  if(Checkbox1.isChecked == true)
    {
      DoSomething();
    }

  if(Checkbox2.isChecked == true)
    {
      DoSomething();
    }

  if(Checkbox3.isChecked == true)
    {
      DoSomething();
    }

}

我如何正确设置bool所以我不必为每个if语句执行“== true”?

答案

由于复选框可以是三态(选中,未选中和未确定),因此您必须保留== true,因为Checkbox.IsChecked是一个可以为空的布尔值,不能像标准布尔值那样进行测试。

即使复选框是双状态并且无法将其设置为不确定状态,用户IsChecked仍然是可以为空的布尔值,因为它可以通过编程方式设置为null

在这种情况下,离开代码绝对没有害处,就像你拥有它一样。你试图删除== true所做的任何事情都可能使代码的可读性降低,可维护性降低,并且可能不太稳定。例如,您可以这样做:

if ((bool)Checkbox1.IsChecked)
{
}

但是如果复选框处于不确定状态,这将引发NullReferenceException,因此根本不是好习惯。

MSDN page on the IsChecked property

另一答案

布尔?是可以为空的类型,可以是'true','false'或'null'。

如果您知道该值不为null,那么您可以执行以下操作:

if(Checkbox1.IsChecked.Value)

或者如果您不知道它是否为null:

if(Checkbox1.IsChecked ?? false)

但保持== true也没有错...

另一答案

在if之后放在括号中的任何内容都必须是一个布尔值,否则代码将无法编译。基本上它只能理解if(false)和if(true)

IsChecked是一个可以为空的bool,它可以是true,false或null。需要== True才能留下“谓词”,可以将其解析为true或false。

如果缺陷为null则.IsChecked == true将为false,如果IsChecked为false,则.IsChecked == true也将为false。只有当.IsChecked == true时,才会返回true并进入if块

另一答案

我对你的问题感到有些困惑,但阅读你的评论听起来好像你正在处理一个可以为空的布尔值。在这种情况下,它可以是null,true或false。可空对象具有属性.HasValue,应在访问之前进行检查。如果HasValue为true,则它不是null对象。

您的代码如下所示:

if(checkbox.IsChecked.HasValue == true && checkbox.IsChecked.Value == true)
{
    DoStuff();
}

略短的版本:

if(checkbox.IsChecked.HasValue && checkbox.IsChecked.Value)
{
    DoStuff();
}

bool被“隐藏”在可以为空的对象后面,因此您可以使用Value访问bool。首先,您需要检查HasValue,如果这是真的,请通过Value访问bool。如果HasValue为假,那么Value为空。

另一答案

您可以创建一个扩展方法,如下所示

public static class BoolExtensions
    {
        public static bool GetBoolOrDefault(this bool? val, bool defaultval)
        {
            return val.HasValue ? val.Value : defaultval;
        }
    }

并以这种方式使用

    private void DoStuff()
    {
      if(Checkbox1.isChecked.GetBoolOrDefault(false))
        {
          DoSomething();
        }

      if(Checkbox2.isChecked.GetBoolOrDefault(false))
        {
          DoSomething();
        }

      if(Checkbox3.isChecked.GetBoolOrDefault(false))
        {
          DoSomething();
        }

    }
另一答案

你可以做 :

if (Checkbox1.Checked)
另一答案

CheckBox.IsCheckedNullable<bool>的财产

如果声明需要直布尔

通过== true你得到一个隐含的演员

选项

Debug.WriteLine(cb1.IsChecked.ToString());
//Debug.WriteLine(((bool)cb1.IsChecked).ToString());  // this fails on null
if (cb1.IsChecked ?? false)
    Debug.WriteLine("cb1.IsChecked ?? false");
if (cb1.IsChecked ?? true)
    Debug.WriteLine("cb1.IsChecked ?? true");
if (cb1.IsChecked == true)
    Debug.WriteLine("cb1.IsChecked == true");

你得到的== true是cb1.IsChecked ??假

以上是关于如何正确使用带有if语句的bool?的主要内容,如果未能解决你的问题,请参考以下文章

已声明且未使用 - 如何更新 IF 语句中的变量

使用 if 语句返回 bool

如何使用 ? : 带有 Razor 和内联代码块的 if 语句

为啥 if 语句迭代返回模棱两可的系列 bool?

带有布尔返回的方法

Operator '||' cannot be applied to operands of type 'bool?' and 'bool?'(代码片段