2010-03-15 6 views
5

저는 현재 VB에서 C#으로 전환 중입니다. 이벤트에 대한 관심을 등록 할 때 몇 가지 문제가 있습니다.C# 이벤트에 등록 할 장소는 어디입니까?

VB를 사용하는 경우에는 간단히 메서드 Handles과 이벤트를 지정하는 경우 일 뿐이며, 종종 이것은 개체 이벤트 목록을 사용하여 생성되었습니다. C#에서 Class.event += delegate을 쉽게 사용할 수는 있지만 코드를 배치하기에 가장 적합한 곳은 어디인지 확신 할 수 없습니다.

생성 된 코드에 따라 InitializeComponent() 내부에 배치하는 것이 가장 좋습니다 (예 : 디자이너에서 이벤트를 선택하는 경우). 또는 가독성/유지 관리를 위해 생성자 내에 배치해야합니다. 생성자 내부에있는 경우 InitializeComponent()을 호출하기 전이나 후에 호출해야합니까?

답변

5

위에서 언급 한 InitializeComponent() 함수로 판단 할 때 WinForm 개발을 수행 할 때 일반적으로 Visual Studio를 사용하여 처리기를 할당합니다. 컨트롤의 속성을 검색하고 번개 아이콘을 클릭하여 모든 이벤트 목록을 가져오고 이벤트를 찾은 다음 두 번 클릭하여 (새 처리기 만들기) 목록에서 기존 처리기를 선택합니다. Visual Studio는 생성 된 코드에이 연결을 추가하므로 걱정할 필요가 없습니다.

+0

당신은 여전히 ​​이것을 할 수 있음을 알았지 만 이벤트를 발생시키는 DLL 클래스를 가지고 있으며 코드를 통해 이들을 등록해야합니다. – themaninthesuitcase

+1

일부 비즈니스 개체의 이벤트를 등록해야하는 경우 완전히 다른 목적으로 사용하기 때문에 UI 이벤트와 별도로 유지합니다. 예를 들어 비즈니스 논리 클래스에서 가능하지 않은 경우 비즈니스 논리 클래스에서 이상적으로 수행하십시오. 폼의 이벤트 처리기를로드하십시오. – Grzenio

3

항상 Init()이라는 개인 메서드를 만든 다음이 메서드를 생성자 또는 Form_Load 이벤트 처리기에서 호출합니다. 그것은 의미 론적으로 더 낫다. IMO는 적절한 생성자 내에서 그것을 수행한다. 다음 번에 디자이너에서 무언가를 변경하면 수동으로 추가 된 코드가 삭제 될 가능성이 있기 때문에 InitializeComponent() 안에 배치하고 싶지는 않습니다.

1

하지만, 대부분은 그렇습니다.

Forms의 전체 기간 동안 이벤트를 연결하려는 경우 InitializeComponent를 사용하십시오 (Forms/UserControls/등을 말하는 것으로 가정합니다). 다른 경우에는 이벤트를 처리 할 때보다 세분화 된 제어가 필요할 것입니다.

양식 삭제 중 또는 더 이상 이벤트를 처리하지 않으려는 경우 - = 구문을 사용하여 이러한 이벤트를 모두 푸시해야합니다. 이벤트 처리기를 첨부 된 상태로 유지하는 것은 가장 일반적인 관리되는 메모리 누수 중 하나입니다.

+0

조명 아이콘을 사용하여 + = 해당 없음을 생성하면 - = 생성됩니다. 어디서 이걸 두어야합니까? 일단 참조가 범위를 벗어나면 GC가이를 관리해야합니다. ? – themaninthesuitcase

+0

Dispose 메서드를 재정의하고이 메서드를 언 후크해야합니다. 구성 요소가 자체 포함되어 있다고 가정하면 (예 : GC 루트의 경로에 범위를 벗어나지 않은 객체가 포함되지 않은 경우) 올바른 것입니다. 그러면 GC가 수행됩니다. 그러나 정적 핸들러를 사용하거나 다른 이벤트가 첨부 된 (분리되지 않은) 컨트롤을 노출하는 경우 "범위를 벗어나지"않고 관리되는 메모리 누수가 발생합니다. – micahtan

0

InitializeComponent() 메서드를 사용하는 경우 디자이너를 사용하고 있으므로 원하는 경우 디자이너에서 직접 이벤트를 바인딩 할 수 있습니다. 이렇게하려면 속성 창에서 번개 모양 아이콘을 클릭하면 선택한 개체에 대한 모든 이벤트 목록이 표시됩니다. 이벤트 이름을 입력하면 코드가 생성됩니다.

디자이너의 팬이 아닌 경우 InitializeComponent 전화를 걸어 연결하고 완료되면 외장을 분리하십시오 (Dispose()).

0

2 가지 방법. 생성자에서 호출 한 자신 만의 메소드를 생성 할 수 있으며, 생성자는 이벤트 핸들러를 생성하거나 생성자에 배치 할 수 있습니다. Finalizer/Destructor 코드에서 이벤트 처리기를 제거하는 것이 좋습니다.

1

아니요 코드를 수동으로 InitializeComponent() 메소드에 추가하십시오. 이 메서드는 코드 생성이므로 양식을 변경하자 마자이 메서드에 수동으로 추가 한 논리는 지워집니다.

일반적으로 양식의 Load 이벤트를 처리하고 거기에 내 이벤트 등록을 추가하는 메소드를 추가하십시오.

0

자식 컨트롤/개체 (예 : 단추)에 이벤트를 등록 할 수 있으므로 InitializeComponent 뒤에 배치 할 것이므로 개체가 이미 만들어 졌는지 확인하고 싶을 것입니다.

다른 이벤트에 대한 응답과 같이 다른 장소에서 이벤트를 동적/조건 적으로 연결하는 경우가 있습니다.

2

때문에 두통을 만들 수 있습니다 InitializeComponent 내에서 이벤트 처리기를 추가 Studio의 디자이너 캔 엉망 코드,이

 
public Form1(){ 
    InitializeComponent(); 
    WireUpEvents(); 
} 

public void WireUpEvents(){ 
    this.fooEvent += new EventHandler(foo_handler); 
    .... etc .... 
} 

처럼 뭔가를 할 그리고 당신이 제거되었는지 확인하는 것이 좋습니다 것 때때로 시각 또한 양식의 폐기 기능의 이벤트 핸들러 ... 양식을 디자인 할

 
public void UnWireEvents(){ 
    this.fooEvent -= new EventHandler(foo_handler); 
    .... etc .... 
} 

, 비주얼 스튜디오는 form.design.cs에있는 InitializeComponent() 방법 내에서 코드를 변경합니다, 그래서 imperativ입니다 이 코드를 수동으로 편집하지 마십시오.

관련 문제