이러한 유형의 접근법은 일반적으로 "나쁜 습관"의 우산 아래 있습니다. 서로 다른 객체를 수정하는 객체를 사용하면 어려운 코드가 확장, 디버그 및 유지되도록하는 밀접한 결합이 직접 도입됩니다.
라이브러리에서 무언가를 수정하는 대신 라이브러리 내의 내용이 변경되었음을 알리는 것이 좋습니다. 예를 들어, 라이브러리 내에서 이벤트를 발생시킬 수 있습니다. 그런 다음 Form1
은 해당 이벤트를 수신하고 해당 구성 요소를 적절히 변경합니다. 이렇게하면 Form1
은 구성 요소를 수정하는 데 전적인 책임이 있으며 라이브러리는 내부 상태의 변경을 알리는 데 전적으로 책임이 있습니다.
좋은 예를 들면, 말하자면 폼의 진행률 표시 줄 구성 요소를 변경했다면 (아마도 더 나은 곳을 찾을 수있을 것입니다) 갑자기 라이브러리에 변경 사항이 도입됩니다.
당신은 같은 것을 할 수있는 이벤트 사용하려면 :
Public Class MyLibrary
Event OnSomethingHappened()
Private Sub SomethingHappened()
RaiseEvent OnSomethingHappened()
End Sub
End Class
를 다음 형태 :
Public Class Form1
Private WithEvents _myLibrary as New MyLibrary
Private Sub LibraryDidSomething() Handles _myLibrary.OnSomethingHappened
MyProgressBar1.Visible = True
End Sub
End Class
이 잘 Form1
에 어떤 의존도가 디커플링이 - 라이브러리는 독립적으로 존재 엔티티이며 이벤트를 청취하는 사람은 상관하지 않습니다.
당신은 또한 공유 이벤트를 사용할 수있는 shared
클래스와이 작업을 수행하려는 경우 - 다음과 같이 프로그래밍 연결되어 있어야합니다 : 형태로
Public Class MyLibrary
Shared Event OnSomething()
Public Shared Sub DoSomething()
RaiseEvent OnSomething()
End Sub
End Class
:
Public Class Form1
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _
Handles MyBase.Load
AddHandler MyLibrary.OnSomethingHappened, AddressOf LibDidSomething
End Sub
Private Sub Form1_FormClosed(sender As System.Object, e As _
System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
RemoveHandler MyLibrary.OnSomethingHappened, AddressOf LibDidSomething
End Sub
Private Sub LibDidSomething()
MyProgressBar1.Visible = True
End Sub
End Class
프로그램 추가 이벤트 당신은 그 (것)들을 구독 한 목표의 처분하기 전에 그 (것)들을 제거하기 위하여주의를 기울여야한다. 이 경우 폼이로드 될 때 처리기를 추가하고 폼이 닫힐 때 제거했습니다. 추가 된 처리기를 제거하지 못하면 양식이 가비지 수집되지 않아 메모리 누수가 발생합니다.
더 읽기 여기를 참조하십시오 : Raising Events and Responding to Events (MSDN)
코드를 일반적으로 UI에 참여하지 않아야 클래스 라이브러리. 격리를 위해 이벤트를 사용합니다. 이 코드는 예를 들어 ProgressChanged 이벤트를 발생시켜야합니다. –