Почему этот параметр ref не меняет переданное значение? - PullRequest
1 голос
/ 26 июля 2011

Переменная 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 ]

1 голос
/ 26 июля 2011

Откуда вы знаете, что asynchExecutions не меняется?Можете ли вы показать свой тестовый код, который подтверждает это?

Похоже, что при создании ThreadForm asynchExecutions будет установлено в 1. Однако когда вы вызываете start_Button_Click, вы устанавливаете asyncExecutions1 в значение в текстовом поле.1004 * Это НЕ БУДЕТ устанавливать 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);
     }
}
1 голос
/ 26 июля 2011

Параметр 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();
    }

}

Это обновит свойство AsynchExecutions экземпляра MyType.

...