Regex或Try Catch验证双重 - 最佳性能

时间:2013-05-17 13:23:44

标签: asp.net regex vb.net try-catch

我有一些变量从客户端传递到服务器。其中一个变量应该以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

后一种选择可能看起来有点模糊,但我总是感到不安,尝试,到处都是陈述。

4 个答案:

答案 0 :(得分:4)

可能首先,您应该将OPTION STRICT设置为ON。然后你的代码甚至不会复制什么是好事。

它不会编译,因为Request.Form返回一个字符串但expectDoubleDouble。字符串可以双重转换为双精度。

您应该使用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将保存该值;否则,默认为零。如果需要,您可以将零值更改为其他默认值。