Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 如何从未来子系统调用调用此子系统的子系统_Vb.net_Class_Stack Trace - Fatal编程技术网

Vb.net 如何从未来子系统调用调用此子系统的子系统

Vb.net 如何从未来子系统调用调用此子系统的子系统,vb.net,class,stack-trace,Vb.net,Class,Stack Trace,天啊,天啊,这个头衔真让人困惑 这最好用一个例子来解释。。这就是我想要发生的事情 Dim m as sub Public sub alg1() call alg2() End sub Public sub alg2() m = alg1 call alg3() End sub Public sub alg3() call m End sub 所以我开始在alg1上运行我的代码。alg1调用alg2,alg2会记录调用它的人(我正在考虑使用stackTrac

天啊,天啊,这个头衔真让人困惑

这最好用一个例子来解释。。这就是我想要发生的事情

Dim m as sub

Public sub alg1()
    call alg2()
End sub

Public sub alg2()
    m = alg1
    call alg3()
End sub

Public sub alg3()
    call m
End sub
所以我开始在alg1上运行我的代码。alg1调用alg2,alg2会记录调用它的人(我正在考虑使用stackTrace.GetFrame(1).GetMethod().Name),然后将其存储在局部变量中,然后alg2继续调用alg3。alg3调用存储在局部变量m中的子变量


现在我的情况有点复杂,因为alg1与alg2在不同的类中,但理论上我所要做的就是对运行时定义的子类进行跨类调用。有没有办法像这样存储sub?

下面是一个运行上述思想的快速示例

简化控制台代码:

Public Module Module1

    Private Delegate Sub CoolDelegate()
    Private m As CoolDelegate

    Public Sub Main()
        Debug.WriteLine("Calling Alg1")
        Alg1()
    End Sub

    Private Sub Alg1()
        Debug.WriteLine("Alg1 Called")

        Debug.WriteLine("Calling Alg2")
        Alg2()
    End Sub

    Private Sub Alg2()
        Debug.WriteLine("Alg2 Called")

        m = New CoolDelegate(AddressOf Alg1)
        Debug.WriteLine("Calling Alg3")
        Alg3()
    End Sub

    Private Sub Alg3()
        Debug.WriteLine("Alg3 Called")

        Debug.WriteLine("Calling m")
        m()
    End Sub
End Module
输出:

Calling Alg1
Alg1 Called
Calling Alg2
Alg2 Called
Calling Alg3
Alg3 Called
Calling m
Alg1 Called
Calling Alg2
Alg2 Called
Calling Alg3
Alg3 Called
Calling m
Alg1 Called
Calling Alg2
Alg2 Called
Calling Alg3
Alg3 Called
Calling m
Alg1 Called
Calling Alg2
(…重复直到堆栈溢出…)

也可以修改它以去掉局部私有变量。这是另一个版本

Public Module Module1

    Private Delegate Sub CoolDelegate()

    Public Sub Main()
        Debug.WriteLine("Calling Alg1")
        Alg1()
    End Sub

    Private Sub Alg1()
        Debug.WriteLine("Alg1 Called")

        Debug.WriteLine("Calling Alg2")
        Alg2(AddressOf Alg1)
    End Sub

    Private Sub Alg2(Caller As CoolDelegate)
        Debug.WriteLine("Alg2 Called")

        Debug.WriteLine("Calling Alg3")
        Alg3(Caller)
    End Sub

    Private Sub Alg3(Caller As CoolDelegate)
        Debug.WriteLine("Alg3 Called")

        Debug.WriteLine("Calling Caller")
        Caller()
    End Sub
End Module

下面是一个运行上述思想的快速示例

简化控制台代码:

Public Module Module1

    Private Delegate Sub CoolDelegate()
    Private m As CoolDelegate

    Public Sub Main()
        Debug.WriteLine("Calling Alg1")
        Alg1()
    End Sub

    Private Sub Alg1()
        Debug.WriteLine("Alg1 Called")

        Debug.WriteLine("Calling Alg2")
        Alg2()
    End Sub

    Private Sub Alg2()
        Debug.WriteLine("Alg2 Called")

        m = New CoolDelegate(AddressOf Alg1)
        Debug.WriteLine("Calling Alg3")
        Alg3()
    End Sub

    Private Sub Alg3()
        Debug.WriteLine("Alg3 Called")

        Debug.WriteLine("Calling m")
        m()
    End Sub
End Module
输出:

Calling Alg1
Alg1 Called
Calling Alg2
Alg2 Called
Calling Alg3
Alg3 Called
Calling m
Alg1 Called
Calling Alg2
Alg2 Called
Calling Alg3
Alg3 Called
Calling m
Alg1 Called
Calling Alg2
Alg2 Called
Calling Alg3
Alg3 Called
Calling m
Alg1 Called
Calling Alg2
(…重复直到堆栈溢出…)

也可以修改它以去掉局部私有变量。这是另一个版本

Public Module Module1

    Private Delegate Sub CoolDelegate()

    Public Sub Main()
        Debug.WriteLine("Calling Alg1")
        Alg1()
    End Sub

    Private Sub Alg1()
        Debug.WriteLine("Alg1 Called")

        Debug.WriteLine("Calling Alg2")
        Alg2(AddressOf Alg1)
    End Sub

    Private Sub Alg2(Caller As CoolDelegate)
        Debug.WriteLine("Alg2 Called")

        Debug.WriteLine("Calling Alg3")
        Alg3(Caller)
    End Sub

    Private Sub Alg3(Caller As CoolDelegate)
        Debug.WriteLine("Alg3 Called")

        Debug.WriteLine("Calling Caller")
        Caller()
    End Sub
End Module

您的示例应该使用
Action
AddressOf

Dim m As Action

Public Sub alg1()
    Call alg2()
End Sub

Public Sub alg2()
    m = AddressOf alg1
    Call alg3()
End Sub

Public Sub alg3()
    Call m()
End Sub
另一个选项是将其作为参数传递:

Public Sub alg2()
    alg3(AddressOf alg1)
End Sub

Public Sub alg3(m As action)
    m()
End Sub

您的示例应该使用
Action
AddressOf

Dim m As Action

Public Sub alg1()
    Call alg2()
End Sub

Public Sub alg2()
    m = AddressOf alg1
    Call alg3()
End Sub

Public Sub alg3()
    Call m()
End Sub
另一个选项是将其作为参数传递:

Public Sub alg2()
    alg3(AddressOf alg1)
End Sub

Public Sub alg3(m As action)
    m()
End Sub

在前30秒内投反对票。。那一定是某种记录。关于如何改进该问题(或为什么被否决)的任何建议?请调查学员。如果alg1和alg2在不同的类中,alg3在哪里?即使您知道函数,您仍然需要对象的引用。你能把这些作为参数传递吗?在你的例子中,你将有一个无限循环,你将如何摆脱它?你能用事件和委托来代替吗?@Jeremy谢谢,这似乎是我在寻找的东西,我仍然有点不知道如何将它们用于我的目的。。。但我想我只需要在这件事上绕一圈!本质上,您可以使用变量来调用函数,因此您需要在函数中传入委托变量,以便稍后调用它。你对你试图解决的实际问题有更高层次的描述吗?你可能看错了。在前30秒内投反对票。。那一定是某种记录。关于如何改进该问题(或为什么被否决)的任何建议?请调查学员。如果alg1和alg2在不同的类中,alg3在哪里?即使您知道函数,您仍然需要对象的引用。你能把这些作为参数传递吗?在你的例子中,你将有一个无限循环,你将如何摆脱它?你能用事件和委托来代替吗?@Jeremy谢谢,这似乎是我在寻找的东西,我仍然有点不知道如何将它们用于我的目的。。。但我想我只需要在这件事上绕一圈!本质上,您可以使用变量来调用函数,因此您需要在函数中传入委托变量,以便稍后调用它。你对你试图解决的实际问题有更高层次的描述吗?你可能看错了。