Return语句意外关闭了应用程序

时间:2016-11-23 23:00:37

标签: vb.net

Module Module1

    Function UnexpectedInput(y, x)

        Console.ForegroundColor = ConsoleColor.Red
        Console.WriteLine("Unexpected Input ! ( " & y & " ) ")
        Console.WriteLine("Please Try Again...")
        Console.ResetColor()

        Console.WriteLine("")
        Return x

    End Function

    Dim choice As String

    Sub Main()

        Console.WriteLine("Please Register to use this program. If you already have an account please choose Loign.")
        Space(1)
        Console.WriteLine("1. Login ")
        Console.WriteLine("2. Register ")
        Console.WriteLine("3. Exit ")
        Space(1)
        Console.WriteLine("##########################")
        choice = Console.ReadLine()
        Console.WriteLine("##########################")

        If choice = "1" Then
            Console.WriteLine("Login()")
            Console.ReadLine()
        ElseIf choice = "2" Then
            Console.WriteLine("Register()")
            Console.ReadLine()
        ElseIf choice = "3" Then
            Console.WriteLine("Exitnow()")
            Console.ReadLine()
        Else
            UnexpectedInput(choice, "Main()")
        End If

    End Sub

End Module

返回x不起作用它只是关闭应用程序。我有它工作,现在它不起作用。我完全陷入困境,我是新手。

1 个答案:

答案 0 :(得分:0)

  

return x无法正常关闭应用程序。

嗯,当然可以。它从UnexpectedInput函数返回到Main,然后Main子例程完成,从而导致应用程序自动关闭。通过思考代码的逻辑,你应该能够自己解决这个问题。即使您无法完全在脑中进行此跟踪,也可以通过单步执行代码,借助Visual Studio中内置的调试器来完成此操作。 (这是一种很棒的练习方式,对于调试难题非常重要。)

Main中,您有以下If构造:

    If choice = "1" Then
        Console.WriteLine("Login()")
        Console.ReadLine()
    ElseIf choice = "2" Then
        Console.WriteLine("Register()")
        Console.ReadLine()
    ElseIf choice = "3" Then
        Console.WriteLine("Exitnow()")
        Console.ReadLine()
    Else
        UnexpectedInput(choice, "Main()")
    End If

如果输入既不是1,2也不是3,那么将输入Else子句。这将导致调用UnexpectedInput函数,有效地将执行跳转到该点。代码将在此处开始运行:

    Console.ForegroundColor = ConsoleColor.Red
    Console.WriteLine("Unexpected Input ! ( " & y & " ) ")
    Console.WriteLine("Please Try Again...")
    Console.ResetColor()

    Console.WriteLine("")
    Return x

这会将一些内容打印到控制台,然后将值x返回给调用者。

回到来电者:

UnexpectedInput(choice, "Main()")

你会注意到调用者完全忽略了函数的返回值。它不会将其分配给变量供以后使用,也不会直接使用它。它只是抛弃它,就像它是Sub,而不是Function。这是完全允许的,如果忽略函数的返回值,编译器甚至不会发出警告。您需要通过阅读和理解代码的流程/逻辑来自行检查。

执行并从UnexpectedInput返回后,控制流程在Main子程序中继续。除了Main子程序中没有其他代码要执行! If构造结束,然后Main结束。一旦Main结束,根据VB.NET语言的规则,整个程序结束。因此,运行时库会自动关闭您的应用程序。

如果您的问题仅仅是控制台窗口关闭太快而无法查看输出,那么您可以通过使用 Ctrl + F5 。这将启动程序而不附加调试器,并且允许控制台窗口自动关闭。相反,它会等待你在关闭之前按下一个键。

或者,正如评论中所建议的那样,如果您希望允许用户在第一个选项无效时输入另一个选项,那么您需要将If构造包装在循环中。 While循环运行良好;有关更多信息,请参阅您最喜欢的VB.NET编程参考。遇到有效输入时,跳出While循环;否则,继续循环直到遇到有效输入(或用户选择退出)。