Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何使事件在对象';s的构造函数完成了吗?_Vb.net_Events_Constructor - Fatal编程技术网

Vb.net 如何使事件在对象';s的构造函数完成了吗?

Vb.net 如何使事件在对象';s的构造函数完成了吗?,vb.net,events,constructor,Vb.net,Events,Constructor,研究告诉我,从构造函数本身引发事件是不可行的,因为对象可能没有完全初始化。。。那么,一旦构造函数被激发,我可以从哪里激发事件呢?您可以使用所示构造函数中的加载或显示事件 Private Sub myForm_Shown(sender As Object, e As EventArgs) Handles Me.Shown End Sub 或 您可以做的一件事是添加一个方法来处理其他post任务: Friend Class FooBar Public Sub New

研究告诉我,从构造函数本身引发事件是不可行的,因为对象可能没有完全初始化。。。那么,一旦构造函数被激发,我可以从哪里激发事件呢?

您可以使用所示构造函数中的加载或显示事件

   Private Sub myForm_Shown(sender As Object, e As EventArgs) Handles Me.Shown

   End Sub


您可以做的一件事是添加一个方法来处理其他post任务:

Friend Class FooBar

     Public Sub New
         ' your code here
     End Sub

     Public Sub Create
        ' do anything you want
     End Sub

End Class
其他地方:

Friend WithEvents Foo As Foobar

' ...
Foo = New FooBar      '  Foo doesnt exist until ctor code executes and the
                      ' code returns to here. 

Foo.Create            ' do whatever you like, as long as any other
                      ' objects referenced have been created.               
从ctor调用sub来引发事件无法与类一起工作的原因如下:

Private Sub SomeEvent(sender As Object, e As EventArgs) Handles Foo.SomeEvent
    Console.Beep()
End Sub
关键是
处理Foo.SomeEvent

没有
Foo
处理该事件。它不会崩溃,也不会引发事件,但侦听器没有对象来捕获/处理事件。在
InitializeComponents
中创建了足够多的表单,它可以与表单一起工作


也可能有一个接口来实现类似的东西,我知道有些接口用于组件,但不用于类。

您可以通过向构造函数添加一个参数并在最后一行调用委托来实现这一点

Public Class Foo

    Public Sub New(ByVal action As Action(Of Foo))
        '...
        '...
        '...
        If (Not action Is Nothing) Then action.Invoke(Me)
    End Sub

End Class
示例

Public Class Form1

    Private Sub Button1_Click(sender As Object, ev As EventArgs) Handles Button1.Click
        Dim foo1 As New Foo("foo1", AddressOf Me.HandleFooCtor)
        Dim foo2 As New Foo("foo2", Sub(f As Foo) MessageBox.Show(f.Name))
    End Sub

    Private Sub HandleFooCtor(f As Foo)
        MessageBox.Show(f.Name)
    End Sub

    Public Class Foo

        Public Sub New(name As String, Optional ByVal action As Action(Of Foo) = Nothing)
            '...
            '...
            '...
            Me.Name = name
            If (Not action Is Nothing) Then action.Invoke(Me)
        End Sub

        Public ReadOnly Name As String

    End Class

End Class

这是一个控件、组件还是一个基本类?@puropoix抱歉-只是一个类,您是在处理类似
初始化的
事件吗?谁是听众?这就是我一直在寻找的。。。。我正在为一个战斗游戏创建角色,该游戏在日志中报告类内事件生成的动作,例如成功攻击对手或死亡,但我想为角色重生生成日志条目。显然,它不必在构造函数中触发,但我希望它是内部的,并且在对象实例化完成后立即发生。在这种情况下,为什么不直接或通过方法添加日志条目呢?事件侦听器就是问题所在。e、 g
Log.AddLine(“巨型死亡机器人创造…”
是的,这基本上就是我的研究得出的结论。当我试图在New()中引发该事件时,什么也没发生。很好的解决办法,虽然不是我想要的,但至少保持封装,谢谢!
Public Class Form1

    Private Sub Button1_Click(sender As Object, ev As EventArgs) Handles Button1.Click
        Dim foo1 As New Foo("foo1", AddressOf Me.HandleFooCtor)
        Dim foo2 As New Foo("foo2", Sub(f As Foo) MessageBox.Show(f.Name))
    End Sub

    Private Sub HandleFooCtor(f As Foo)
        MessageBox.Show(f.Name)
    End Sub

    Public Class Foo

        Public Sub New(name As String, Optional ByVal action As Action(Of Foo) = Nothing)
            '...
            '...
            '...
            Me.Name = name
            If (Not action Is Nothing) Then action.Invoke(Me)
        End Sub

        Public ReadOnly Name As String

    End Class

End Class