首页 > 解决方案 > Visual Basic 验证

问题描述

我是 Visual Basics 的新手,我尝试在我的应用程序中为Mark输入实现输入验证,其中输入不能为空< 0> 100isnumeric(Mark) = False,否则将显示错误消息. 但是,我尝试将输入保留为空或输入字母值,但它返回给我一个运行时错误。任何人都可以帮助我进行一些解释以及如何克服这个问题吗?抱歉,如果这是一个愚蠢的问题。

注意:变量“Mark”的数据类型设置为单一。感谢您的时间!

Sub InputMark()
     4: For I = 0 To 3
        Console.WriteLine("Please enter test marks for test " & I + 1)
        Mark(I) = Console.ReadLine

        While Mark(I) = Nothing Or Mark(I) < 0 Or Mark(I) > 100 Or IsNumeric(Mark(I)) = False
            Console.WriteLine("Please enter valid test marks.")
            GoTo 4
        End While
    Next
End Sub

标签: vb.netvalidation

解决方案


变量“Mark”的数据类型设置为单一。

.Net 等强类型平台的优点之一是您的大多数验证规则都已强制执行。您将无法将非数字值分配给Mark,并且作为值类型它甚至不能null(VB.NetNothing将评估0Single类型)。

因此,我们需要做的是备份,并在将数据分配给变量之前查找从用户那里接收到的数据。Mark在某个地方,您将拥有类似Mark(I) = Console.Readline()或类似的代码。这就是您需要进行测试的地方。在将其分配给 Single 值之前,检查从用户收到的字符串值。当你到了这一点时,完成这个测试的最好方法就是使用函数. 然后,您可以验证解析的 Single 值是否在正确的范围内。Single.TryParse()


好的,有了更完整的代码,我们就可以开始给你一些真正的改进了。

一个建议是考虑返回值。让这个函数返回数组是更好的设计,而不是通过全局变量进行通信。我在这里提到这一点,因为这也意味着改变你调用这个函数的方式。

不碍事的:

Function InputMarks() As Single()
     Dim result(3) As Single

     For I As Integer = 0 To 3
        Dim ErrorMsg As String = ""
        Do 
            Console.Write($"{ErrorMsg}Please enter test marks for test {I+1}: ")
            Dim input As String = Console.ReadLine()
            ErrorMsg = $"{vbCrLf}Please enter valid test marks.{vbCrLf}{vbCrLf}"
        While Not Single.TryParse(input, result(I)) OrElse result(I) < 0 OrElse result(I) > 100
     Next

    Return result
End Function

不需要GOTO或不需要。

如果您还没有看到它们,那么它们$"strings"正在使用字符串插值OrElse运算符而不是Or用于获得短路行为。现代 VB.Net 应该一直使用OrElseandAndAlso而不是Orand And

在这种情况下, usingOrElse意味着我们确定成功完成,并且在尝试验证范围之前Single.TryParse()我们将拥有一个有效的数字。如果解析操作失败,甚至不会尝试范围测试。


推荐阅读