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

时间:2016-12-28 16:51:09

标签: c# .net if-statement boolean

我有一个名为“DoStuff()”的方法,它的作用是检查复选框是否被选中以及它们是否有效。

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

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

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

}

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

7 个答案:

答案 0 :(得分:7)

由于复选框可以是三态(已选中,未选中且未确定),因此== true必须保留Checkbox.IsChecked,因为IsChecked是一个可以为空的布尔值,它可以是' t只需像标准布尔值一样进行测试。

即使复选框是双状态并且无法将其置于其中,用户null的不确定状态仍然是可以为空的布尔值,因为它可以设置为== true编程。

在这种情况下,保留代码绝对没有害处,就像你拥有它一样。您尝试删除if ((bool)Checkbox1.IsChecked) { } 所做的任何事情都可能使代码更不易读,维护更少且可能更不稳定。例如,您可以这样做:

Conf. properties>>Debugging>>Command

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

MSDN page on the IsChecked property

答案 1 :(得分:3)

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

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

if(Checkbox1.IsChecked.Value)

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

if(Checkbox1.IsChecked ?? false)

但保持== true ......

并没有错

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

您的代码如下所示:

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为false,则Value为空。

答案 4 :(得分:0)

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

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

    }

答案 5 :(得分:-1)

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

答案 6 :(得分:-1)

你可以这样做:

public function uploadAction()
{
    $this->_helper->viewRenderer->setNoRender();
    $data = $errors = $line_of_text = [];

    if ($this->getRequest()->isPost()) {
        $path = '/cronjobs/uploads/charge_type_details';

        if (!@mkdir($path, 0777, true) && !is_dir($path)) {
            $data['error'][] = "Not able to create subdirectory: <strong>{$path}</strong>";
            echo json_encode($data);

            die();
        }

        $di = new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS);
        $ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
        foreach ($ri as $file) {
            $file->isDir() ? rmdir($file) : unlink($file);
        }

        $adapter = new Zend_File_Transfer_Adapter_Http();
        $adapter->setDestination($path);
        $adapter->addValidator('Extension', false, ['extension' => 'csv', 'case' => true]);
        $adapter->addValidator('MimeType', false, 'text/plain');
        $adapter->addValidator('Size', false, ['max' => ini_get('upload_max_filesize').'B']);

        if ($adapter->isValid() === false) {
            foreach ($adapter->getMessages() as $message) {
                $data['error'][] = $message;
            }

            echo json_encode($data);

            die();
        }

        $file     = $adapter->getFileInfo()['file'];
        $ext      = pathinfo($file['name'])['extension'];
        $new_path = $file['tmp_name'];

        $file_handle = fopen($new_path, 'r');

        while (($result = fgetcsv($file_handle)) !== false) {
            if (array(null) !== $result) { // ignore blank lines
                $line_of_text[] = $result;
            }
        }

        $unique_rows = array_unique($line_of_text, SORT_REGULAR);

        if (false === $this->isFileHeadersValid(
                array_map('strtolower', $unique_rows[0]),
                [
                    'country',
                    'charge_type',
                    'charge_type_code',
                    'business_sla_description',
                    'service_provider',
                    'sub_menu',
                    'charge_type_group',
                    'transaction_type',
                    'slc_code',
                    'coverage_code',
                    'standard_sla',

                ]
            )
        ) {
            $data['error'][] = $this->translate->_('Required file headers are not present. Please check the file and try again.');
            echo json_encode($data);

            die();
        }

        unset($unique_rows[0]);

        $data['error'] = $errors;

        $data['file'] = array(
            'name'     => $file['name'],
            'size'     => $adapter->getFileSize(),
            'file_ext' => $ext
        );
    } else {
        $data['error'] = 'Invalid request.';
    }

    echo json_encode($data);

    die();
}