【问题标题】:Boolean parameter returning false after to be set to true in a method [closed]在方法中设置为 true 后返回 false 的布尔参数 [关闭]
【发布时间】:2017-10-28 11:16:45
【问题描述】:

我有一个表单,它调用另一个将执行操作的表单,如果该操作完成,我在父表单中作为参数放置的标志将在子表单中设置为 true,但如果该操作未完成,标志保持为假。

父窗体中的代码:

bool flag = false;
new ChildForm(flag).ShowDialog();
if(flag)
{
//some code that depends on that flag be true
}

子窗体中的代码:

bool flag;
public ChildForm(bool flag)
{
InitializeComponent();
this.flag = flag;
}
private SomeMethod()
{
//some code
flag = true;
this.Close();
}

调试一下看到子窗体的flag设置为true后,父窗体的flag也为true,但是子窗体关闭后程序返回执行父窗体的代码,flag又变回了假的。

发生了什么事?

【问题讨论】:

  • 在这个代码示例中,if(flag) 正在进入是不可能的
  • @BennoDual 怎么样?子窗体中的方法将 flag 设置为 true。
  • 它将 ChildForm 中的标志设置为 true - 这对父表单中的变量没有影响。
  • @BennoDual 正如我所说,调试器显示父标志为真,这就是我不明白的原因。

标签: c# parameters boolean flags


【解决方案1】:

flag 变量按值传递给ChildForm 的构造函数,并分配给也称为flag 的私有变量。这意味着对私有变量的任何更改都不会影响原始变量。

要解决此问题,您需要将 ChildForm 变量声明为公共变量并在原始方法中使用它。

public boolean flag;
public ChildForm(boolean flag)
{
  InitializeComponent();
  this.flag = flag;
}
private SomeMethod()
{
  //some code
  flag = true;
  this.Close();
}

并改变原来的方法如下

boolean flag = false;
var form = new ChildForm(flag);
form.ShowDialog();
if(form.flag)
{
//some code that depends on that flag be true
}

有关按值/引用传递变量的更多信息,请参阅https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-value-type-parameters

【讨论】:

  • 正如我所说,调试显示父标志为真,这就是我不明白的原因。你解决了我的问题,谢谢
【解决方案2】:

它似乎在父表单中更改为true 的事实可能只是在调试器中查看它的副作用。它实际上并没有将其更改为true

如果您想从子表单中读取值,则需要使其可访问。

父表单:

var c = new ChildForm();
c.ShowDialog();
if (c.Flag)
{
    //some code that depends on that flag be true
}

子窗体:

public bool Flag { get; private set; }
public ChildForm()
{
    InitializeComponent();
}
private SomeMethod()
{
    //some code
    Flag = true;
    this.Close();
}

【讨论】:

  • 调试中的副作用欺骗了我。谢谢
【解决方案3】:

你可以这样做:

public class ChildForm {
    public ChildForm(bool flag) {
       InitializeComponent();
       this.Flag = flag;
    }

    private SomeMethod() {
        //some code
        this.Flag = true;
        this.Close();
    }
    public bool Flag {get;}
}

public class ParentForm {
   public void Foo() {
      bool flag = false;
      var child = new ChildForm(flag);
      child.ShowDialog();
      if(child.Flag) {
          //some code that depends on that flag be true
      }
   }
}

【讨论】:

  • 正如我所说,调试显示父标志为真,这就是我不明白的原因。这工作,谢谢
猜你喜欢
  • 2020-06-23
  • 2017-09-16
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
相关资源
最近更新 更多