2011-07-26 4 views
1

변수 asynchExecutions가 변경되지만 참조 변수는 변경되지 않습니다.
간단한 질문입니다.이 생성자의이 ref 매개 변수가 전달 된 원래 값을 변경하는 이유는 무엇입니까?이 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

생성자를 호출하는 코드를 게시 할 수 있습니까? 또한, 왜 당신의 폼이 버튼의'Click' 이벤트 중에 자살을하는 것입니까? –

답변

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); 
    } 
} 
1

out 매개 변수는 메서드 호출에만 좋으며 나중에 업데이트하려면 저장할 수 없습니다.

따라서 start_Button_Click에서 양식 생성자에 전달 된 원래 매개 변수를 변경할 수 없습니다. 합니다 MyType의 인스턴스의 AsynchExecutions 속성을 업데이트합니다

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

} 

:

당신이 뭔가를 할 수 있습니다.