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

时间:2011-07-26 17:45:28

标签: c# variables pass-by-reference ref

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

}

2 个答案:

答案 0 :(得分:1)

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属性。

答案 1 :(得分:1)

你怎么知道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);
     }
}