我有一些变量从客户端传递到服务器。其中一个变量应该以double形式接收,但偶尔我们会从客户端获取一些字符串或空变量,从而引发异常。
我的问题是,从性能方面来看,最好将变量包装在try中,捕获并在失败时应用默认值:
Dim expectDouble As Double
Try
expectDouble = Request.Form("pastFromClient")
Catch ex As Exception
expectDouble = 0 'Default to zero
End Try
或者最初将所有传入变量视为字符串对象并针对正则表达式运行它们?
Dim expectDouble As Double
If Regex.IsMatch(Request.Form("pastFromClient").toString, "^\d{1,}\.{0,1}\d{0,4}$") Then
expectDouble = Request.Form("pastFromClient")
Else
expectDouble = 0 'Default to zero
End If
后一种选择可能看起来有点模糊,但我总是感到不安,尝试,到处都是陈述。
答案 0 :(得分:4)
可能首先,您应该将OPTION STRICT
设置为ON
。然后你的代码甚至不会复制什么是好事。
它不会编译,因为Request.Form
返回一个字符串但expectDouble
是Double
。字符串不可以双重转换为双精度。
您应该使用Double.Parse
或本例Double.TryParse
。性能不是主要原因,但失败的安全性和可读性。
Dim expectDouble As Double
If Double.TryParse(Request.Form("pastFromClient"), expectDouble) Then
' here you have the value of expectDouble '
End If
答案 1 :(得分:0)
正则表达式通常很慢,Try / Catch块也是如此。在这种情况下,我会采用第二种方法,但我不会使用Regexes。
答案 2 :(得分:0)
正如Tim正确指出应该避免隐式转换,在这种情况下,您可以在一行中执行操作,以便以下
Dim expectDouble As Double
If Regex.IsMatch(Request.Form("pastFromClient").toString, "^\d{1,}\.{0,1}\d{0,4}$") Then
expectDouble = Request.Form("pastFromClient")
Else
expectDouble = 0 'Default to zero
End If
变成
Dim expectDouble As Double
If NOT Double.TryParse(Request.Form("pastFromClient"), expectDouble) Then expectDouble = 0
答案 3 :(得分:0)
其他人都是对的。你想明确地自己进行投射。此外,您的正常程序流程永远不应该依赖于捕获的异常。他们被称为“例外”是有原因的。
以下是使用三元运算符在一行中执行此操作的方法:
Dim expectDouble As Double = If(Double.TryParse(Request.Form("pastFromClient"), expectDouble), expectDouble, 0)
如果传递给表单的值是有效的double,那么expectDouble将保存该值;否则,默认为零。如果需要,您可以将零值更改为其他默认值。