我在另一个论坛上发布了一个代码片段,寻求帮助,人们向我指出,使用GoTo语句是非常糟糕的编程习惯.我想知道:为什么不好?
GoTo在VB.NET中有哪些替代方法可以被认为是更好的做法?
请考虑以下用户必须输入其出生日期的片段.如果月/日/年无效或不切实际,我想循环回来并再次询问用户.(我正在使用if语句来检查整数的大小......如果有更好的方法可以做到这一点,我会很感激,如果你能告诉我那个:D)
retryday:
Console.WriteLine("Please enter the day you were born : ")
day = Console.ReadLine
If day > 31 Or day < 1 Then
Console.WriteLine("Please enter a valid day")
GoTo retryday
End If
Run Code Online (Sandbox Code Playgroud)
Ear*_*rlz 18
我将与其他人不同,并说GOTO本身并不是所有的邪恶.邪恶来自滥用GOTO.
一般来说,几乎总是比使用GOTO更好的解决方案,但有时候GOTO是正确的方法.
话虽这么说,你是一个初学者,所以你不应该被允许判断GOTO是否适当(因为它几乎没有)再过几年.
我会写这样的代码(我的VB有点生锈......):
Dim valid As Boolean = False
While Not valid
Console.WriteLine("Please enter the day you were born: ")
Dim day As String
day = Console.ReadLine
If day > 31 Or day < 1 Then
Console.WriteLine("Please enter a valid day.")
Else
valid = True
End If
End While
Run Code Online (Sandbox Code Playgroud)
如果您使用GOTO代码并查看它,有人会如何处理您的代码?"嗯... retryday?这是做什么的?这是什么时候发生的?哦,所以如果当天超出范围我们就转到那个标签.好的,所以我们想循环直到日期被认为是有效的并且在范围内" .
如果你看看我的:
"哦,我们希望继续这样做,直到它有效.它在日期在范围内时有效."
http://xkcd.com/292/ 我认为这是Goto的标准意见.
而是尝试使用do while循环.while while循环将始终执行一次,并且当您需要支持用户时很好,但请确保它们输入正确的信息.
Sub Main()
Dim valid as Integer
valid=0
Do Until valid = 1
System.Console.WriteLine("enter the day ")
day = System.Console.ReadLine()
If day > 31 Or day < 1 Then
System.Console.WriteLine("Invalid day\n")
valid = 0;
Else
valid = 1
Loop
End Sub
Run Code Online (Sandbox Code Playgroud)