Почему этот параметр 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();
    }

}

person Joey Gfd    schedule 26.07.2011    source источник
comment
Можете ли вы опубликовать код, который вызывает конструктор? Кроме того, почему ваша форма совершает самоубийство во время события кнопки Click?   -  person Frédéric Hamidi    schedule 26.07.2011


Ответы (2)


Откуда вы знаете, что 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);
     }
}
person Jonathan Holland    schedule 26.07.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.

person CodeNaked    schedule 26.07.2011