2017-02-03 97 views
-1

这似乎是验证数据输入的一种很差的方式。我发现自己做了很多事情。程序可以组合或简化吗?验证数据输入

子的Main() ...

Console.Write("Landscape Size: ") 
       IsNumeric(LandscapeSize) 
       Console.Write("Initial number of warrens: ") 
       IsNumeric(InitialWarrenCount) 
       Validate(InitialWarrenCount, LandscapeSize) 
       Console.Write("Initial number of foxes: ") 
       IsNumeric(InitialFoxCount) 
       Validate(InitialFoxCount, LandscapeSize) 

这里是两个潜艇这似乎过于复杂:

Sub IsNumeric(ByRef Variable As Integer) 
    While True 
     Try 
      Variable = CInt(Console.ReadLine()) 
      Exit While 
     Catch 
      Console.WriteLine("Error: Please enter a number:") 
     End Try 
    End While 
End Sub 
Sub Validate(ByVal Variable As Integer, ByVal LandscapeSize As Integer) 
    Dim Size As Integer 
    Size = (LandscapeSize * LandscapeSize) 
    While Variable <= 0 Or Variable >= Size 
     Console.WriteLine("Error: Please enter a number:") 
     While True 
      Try 
       Variable = CInt(Console.ReadLine()) 
       Exit While 
      Catch 
       Console.WriteLine("Error: Please enter a number:") 
      End Try 
     End While 
    End While 
End Sub 

非常感谢

+0

我没有看到很多你可以改变的地方......也许你可以结合几行,但它不会帮助你。 –

+0

两条评论:1.不要使用名称IsNumeric ..这是一个保留的系统函数名称。 2.使用try/catch来捕获非数字不是最好的方法。错误处理具有与其相关的大量开销。您最好阅读一个字符串并使用系统函数IsNumeric()进行测试。 –

+0

@Trevor在某种程度上,我对你说的那种感觉很满意。有两次尝试抓住声明似乎非常辛苦。谢谢。编辑 - 所以声明为字符串和使用IsNumeric ..听起来更好... – Rich

回答

1

那么重命名则IsNumeric .. 使用TryParse代替尝试捕获

Sub ReadNumber(ByRef Variable As Integer) 
    Do 
     If Integer.TryParse(Console.ReadLine(), variable) Then Exit Sub 
     Console.WriteLine("Error: Please enter a number:") 
    Loop 
End Sub 

Sub Validate(ByVal Variable As Integer, ByVal LandscapeSize As Integer) 
    Dim Size As Integer = LandscapeSize * LandscapeSize 
    While Variable <= 0 Or Variable >= Size 
     Console.WriteLine("Error: Please enter a number:") 
     do 
      If Integer.TryParse(Console.ReadLine(), variable) Then Exit Do 
      Console.WriteLine("Error: Please enter a number:") 
     loop 
    End While 
End Sub 

但是,我猜你确实希望Validate中的第一个变量是ByRef NOT ByVal。

+0

我很感激。 TryParse似乎是一种更高效的方法。谢谢。 – Rich