vb.net - Visual Basic 验证
问题描述
我是 Visual Basics 的新手,我尝试在我的应用程序中为Mark输入实现输入验证,其中输入不能为空或< 0或> 100或isnumeric(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
解决方案
变量“Mark”的数据类型设置为单一。
.Net 等强类型平台的优点之一是您的大多数验证规则都已强制执行。您将无法将非数字值分配给Mark
,并且作为值类型它甚至不能null
(VB.NetNothing
将评估0
为Single
类型)。
因此,我们需要做的是备份,并在将数据分配给变量之前查找从用户那里接收到的数据。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 应该一直使用OrElse
andAndAlso
而不是Or
and And
。
在这种情况下, usingOrElse
意味着我们确定成功完成,并且在尝试验证范围之前Single.TryParse()
我们将拥有一个有效的数字。如果解析操作失败,甚至不会尝试范围测试。
推荐阅读
- powershell - 执行前 Powershell 编码的命令变量评估(ServiceNow、Invoke-WMIMethod)
- ios - iOS如何从解析Swift 4中获取行
- gitlab - How to run fastlane pipeline for feature branches?
- c# - 如何使用 ServiceBus EventData 偏移值
- php - Attach multiples files with sendmail PHP
- amazon-web-services - AWS serverless architecture – Why should I use API gateway?
- c# - 如何使用 kinect 和 unity 在 C# 中控制 Cloth 的骨骼
- javascript - Css text animation issue
- javascript - Black space after HTML ends
- mysql - 数据库模型修正mysql?