2010-04-12 4 views
28

양식 생성자와 form_Load 메서드의 차이점은 무엇입니까?폼 생성자 대 Form_Load

한 항목을 다른 항목에 배치하는 과정은 무엇입니까?

답변

16

양식을 만들 때 즉시 표시 여부와 관계없이 생성자의 코드가 실행됩니다. Form.Load 이벤트로 실행되는 코드는 이벤트 핸들러이므로 실제로 폼에 가입 한 다른 클래스의 코드에서 코드를 실행할 수 있습니다. 마찬가지로 (양식에서) Form.OnLoad method을 사용하여 코드를 실행할 수 있습니다.

폼의 Load 이벤트 (및 폼에서 더 나은 선택 인 OnLoad 재정의 가능 메서드)는 폼이 초기화 된 후에 실행됩니다. 양식의 모든 컨트롤이 이미 구성되어 있고 더 중요한 것은 모든 양식 레이아웃이 발생했기 때문에이 기능은 종종 장점이 있습니다.

+0

몇 가지 사항 : 1 - 얼마나 자주 당신은 그것을 보이지 않는 양식을 만들겠습니까? (당신의 의존성이 지연된 Instansiation으로 적절하게 주입된다면 Esp) 2- 아래의 @Hans에서 언급했듯이, 폼의 모든 컨트롤이 응답하려고하므로 레이아웃이 일시 중지되지 않은 상태에서 컨트롤 초기화에 대한 성능 패널티가 발생합니다 초기화되는 동안 다시 그리기 이벤트 같은 것들. 3 나는 내 자신의 코드를 호출하기 위해 OnLoad를 사용하지 않는다. 오히려 MyAction()에 대한 메소드를 작성하고 OnLoad에서 MyAction()을 호출하십시오. 그렇지 않으면 MyAction을 수행하기 위해 OnLoad를 호출해야한다는 것이 소비자에게 명확하지 않습니다. – Fred

+1

@Fred 필자가 작성한 것과 충돌에 대해서는 논쟁 할 것이 없습니다. 나는 OnLoad가 초기화 후에 일어난다는 것을 구체적으로 언급했고, OnLoad에 * controls *를 추가 할 것을 제안하지 않았다. 귀하의 요점에 관해서는 3 - 소비자는 절대로 "OnLoad를 호출"- 그것은 런타임에 발생합니다. 코드가 다른 위치에서 재사용되지 않으면 다른 방법을 소개 할 때 별다른 장점이 없습니다. (그러나 "MyAction"이 재사용 될 것이라면 완전히 동의합니다. 내 답변은 배제하지 않거나 제안하지 않습니다.) –

+0

컨트롤 추가를 생각하지 마십시오. 다운 목록, 목록 상자 등? 나는 경험을 통해 OnLoad에서 더 느린 것을 이야기합니다. MyAction에 대한 요점은 첫 번째 단락의 끝 부분을 해석 한 것입니다 (아마도 잘못). 전반적으로, 일반적인 경험 법칙은 onload에서 "중요"하지 않는다고 말하고 싶습니다. 내가 생각할 수있는 유일한 유효한 동작은 현재 레이아웃 정보 (예 : 폼의 크기/컨트롤의 픽셀 위치)를 필요로하는 것입니다. 발표자가 데이터 초기화를 처리해야하므로 프리젠 테이션 패턴 (예 : MVP)을 따르는 것이 중요합니다. – Fred

27

Load 이벤트를 사용하지 마십시오. OnLoad() 메서드를 재정의하십시오. 이렇게하면 폼 클래스에서 파생 될 때 모든 것이 예측 가능한 순서로 실행됩니다. 실제 양식의 크기를 알아야하는 양식 초기화에만 사용해야합니다. 크기 조정이나 사용자 기본 설정으로 인해 디자인 크기와 다를 수 있으며 실제 크기는 기본 창이 만들어 질 때까지 알 수 없습니다.

OnLoad 메서드에서 컨트롤을 초기화 할 수는 있지만 ListView 및 TreeView의 경우 특히 느려질 수 있습니다. 생성자에서 초기화하면 기본 Windows 컨트롤을 만들 때 대량으로 초기화 할 수 있습니다.

한 가지 특별한 예외 : MDI 자식 창 만들기는 항상 OnLoad()에서 수행해야합니다. 생성자에서 자식을 만들 때 MDI 막대를 엉망으로 만드는 배관 코드에 버그가 있습니다.

관련 문제