这种类型的方法通常属于“不良做法”的范畴。让对象相互修改成员直接引入了紧密耦合,这使得代码难以扩展、调试和维护。
与其尝试从库中修改某些内容,不如从通知库中的某些内容已更改的角度进行思考。例如,您可以在库中引发事件。 Form1
然后可以侦听该事件并对其组件进行适当的更改。这种方式Form1
单独负责修改其组件,而库单独负责宣布对其内部状态的更改。
举一个很好的例子——比如说,如果您要更改 Form 的进度条组件(也许您会找到更好的组件),您会突然在库中引入一个重大更改。
要使用事件,您可能会执行以下操作:
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
当以编程方式添加事件时,您必须注意在处理已订阅它们的对象之前删除它们。在这种情况下,我在表单加载时添加了处理程序,并在表单关闭时将其删除。如果您未能删除添加的处理程序,则不会对表单进行垃圾收集,这将导致内存泄漏。
有关更多信息,请参见此处:引发事件和响应事件 (MSDN)