为什么这个ref参数不改变传入的值?

本文关键字:改变 ref 参数 为什么 | 更新日期: 2023-09-27 18:03:41

变量asynchExecutions确实被更改了,但它没有更改引用变量。
简单的问题,为什么这个构造函数中的ref参数不改变传入的原始值?

public partial class ThreadForm : Form
{
    int asynchExecutions1 = 1;
    public ThreadForm(out int asynchExecutions)
    {
        asynchExecutions = this.asynchExecutions1;
        InitializeComponent();
    }
    private void start_Button_Click(object sender, EventArgs e)
    {
        int.TryParse(asynchExecution_txtbx.Text, out asynchExecutions1);
        this.Dispose();
    }
}

为什么这个ref参数不改变传入的值?

你怎么知道asynchExecutions没有改变?您能展示证明这一点的测试用例代码吗?

似乎在构造ThreadForm时asynchExecutions将被设置为1。然而,当你调用start_Button_Click时,你设置asyncExecutions1为文本框中的值。

这不会将asyncExecutions设置为文本框中的值,因为这些是值类型。您没有在构造函数中设置指针。

在我看来,你似乎混淆了值类型和引用类型的行为。

如果你需要在两个组件之间共享状态,可以考虑使用静态状态容器,或者将共享状态容器传递给ThreadForm的构造函数。例如:

 public class StateContainer
 {
     public int AsyncExecutions { get; set;}
 }
public class ThreadForm : Form
{
     private StateContainer _state;
     public ThreadForm (StateContainer state)
     {
          _state = state;
          _state.AsyncExecutions = 1;
     }
     private void start_Button_Click(object sender, EventArgs e)
     {
          Int.TryParse(TextBox.Text, out _state.AsyncExecutions);
     }
}

out参数只适用于方法调用,你不能"保存"它以便以后更新。

所以在你的start_Button_Click,你不能改变原始参数传递给你的表单构造器。

你可以这样做:

public class MyType {
   public int AsynchExecutions { get; set; }
}
public partial class ThreadForm : Form
{
    private MyType type;
    public ThreadForm(MyType t)
    {
        this.type = t;
        this.type.AsynchExecutions = 1;
        InitializeComponent();
    }
    private void start_Button_Click(object sender, EventArgs e)
    {
        int a;
        if (int.TryParse(asynchExecution_txtbx.Text, out a))
            this.type.AsynchExecutions = a;
        this.Dispose();
    }
}

将更新MyType实例的AsynchExecutions属性