【问题标题】:How do I correctly use a bool with an if statement?如何正确使用带有 if 语句的布尔值?
【发布时间】:2017-05-12 23:48:30
【问题描述】:

我有一个名为“DoStuff()”的方法,它的作用是检查复选框是否被选中,如果它们被选中,则执行某些操作。

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

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

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

}

如何正确设置布尔值,这样我就不必为每个 if 语句都执行“== true”?

【问题讨论】:

  • 但是它不知道它是否是布尔值?
  • 如果我删除 == true 我得到这个..“不能隐式转换类型'bool?'到“布尔”。存在显式转换(您是否缺少演员表?)“
  • 设置 bool 有什么帮助?而不是== true,你仍然必须写== MyBool
  • 布尔值?不是布尔型,也可以为空。
  • 任何有这么多答案的问题都应该被投赞成票。

标签: c# .net if-statement boolean


【解决方案1】:

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

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

在这种情况下,将代码保留原样绝对没有害处。您尝试删除== true 所做的任何事情都可能使代码的可读性降低、可维护性降低并且可能不太稳定。例如,您可以这样做:

if ((bool)Checkbox1.IsChecked)
{
}

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

MSDN page on the IsChecked property

【讨论】:

  • @JonnyKhanas 是您问题中的代码错误还是您删除了== true 之后的错误?我看不到在前一种情况下会发生这种情况,但在后一种情况下是可以预料的。
  • 这是在我删除== true之后发生的
  • @JonnyKhanas - 这是完全正确的。 IsChecked 属性是一个可为空的布尔值 (bool?),您不能隐式转换为布尔值 (bool)。您必须在代码中留下== true。没有其他干净、安全的写法。
  • 那为什么每个人都告诉我删除==true,因为当我删除它时,我就会收到错误。
  • @JonnyKhanas 他们告诉你删除== true 是错误的。如果你注意到这些 cmets 和答案现在已被删除。
【解决方案2】:

布尔?是一个可为空的类型,可以是“真”、“假”或“空”。

如果您知道该值不会为空,那么您可以这样做:

if(Checkbox1.IsChecked.Value)

或者如果你不知道它是否为空:

if(Checkbox1.IsChecked ?? false)

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

【讨论】:

    【解决方案3】:

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

    IsChecked 是一个可为空的 bool,它可以是 true、false 或 null。 ==True 是必需的,这样您就可以得到一个可以解析为真或假的“谓词”。

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

    【讨论】:

      【解决方案4】:

      我对你的问题有点困惑,但是阅读你的 cmets 听起来你正在处理一个可以为空的布尔值。在这种情况下,它可以为 null、true 或 false。 Nullable 对象有一个属性 .HasValue 应该在访问之前检查。如果 HasValue 为 true,则它不是 null 对象。

      您的代码如下所示:

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

      略短的版本:

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

      布尔值“隐藏”在可空对象后面,因此您可以使用Value 访问布尔值。首先,您需要检查HasValue,如果是这样,请通过Value 访问布尔值。如果HasValue 为假,则Value 为空。

      【讨论】:

        【解决方案5】:

        您可以创建如下扩展方法

        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();
                }
        
            }
        

        【讨论】:

        • 简单地使用??不是更容易吗?
        • 哦,是的@EricLippert,这也是处理 bool 的好方法,谢谢。
        【解决方案6】:

        你可以这样做:

        if (Checkbox1.Checked)
        

        【讨论】:

          【解决方案7】:

          CheckBox.IsCheckedNullable<bool> 属性

          if 语句需要一个直接的布尔值

          == 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 ??假的

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-08-20
            • 2014-02-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-20
            • 1970-01-01
            相关资源
            最近更新 更多