为什么isNumeric(string)在带有复合条件语句的while循环中崩溃?

时间:2014-04-01 20:38:31

标签: vb.net visual-studio-2010

今天,当我遇到这个错误时,我正和学生们一起做一个课堂项目。

Imgur Link

Pastebin Link

基本上,decTemperature是一个String变量,它接收来自User的输入。为了教授数据验证,短路和循环,我们使用以下While循环条件强制执行有效响应:

While IsNumeric(decTemperature) = False Or Convert.ToDecimal(decTemperature) <= 0.0 Or Convert.ToDecimal(decTemperature) > 135.0

如果用户在理论上放入&#39; abc&#39;, ,条件语句应该在到达条件语句的第二部分之前短路。我尝试了一些不同的条件,但最终它会在每个设计中崩溃。

我对此问题的假设可能与an older question I asked about dealing with data types with explicitly setting Option Strict 'on'密切相关(尽管上述代码中的Option Strict On快速添加仍然崩溃)。也就是说,在评估之前,每个条件语句中都会处理decTemperature

无论是什么情况,导致问题的原因以及仍然维护概念的更好的方法(即强制用户的有效响应)?我有一个使用布尔数据类型validResponse并设置它的想法,但这似乎是将短路作为一个概念抛弃。

2 个答案:

答案 0 :(得分:2)

Or不会短路。 And

也没有

OrElse会发生短路(以及AndAlso)。见OrElse Operator (Visual Basic)

所以看起来应该是这样的:

While IsNumeric(decTemperature) = False OrElse _
      (Convert.ToDecimal(decTemperature) <= 0.0 OrElse _
       Convert.ToDecimal(decTemperature) > 135.0)

我会考虑使用Decimal.TryParse来测试输入的有效性。

答案 1 :(得分:1)

如果您只使用Or,则会在每种情况下评估每个语句。这就是短路运营商OrElseAndAlso的用途。如果使用OrElse,If语句会在检测到第一个真实语句后停止评估(如果是AndAlso,则停止第一个false语句。)

因此,在您的情况下,无论如何都会执行到十进制的转换。短路操作员可以避免这种情况。