今天,当我遇到这个错误时,我正和学生们一起做一个课堂项目。
基本上,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
并设置它的想法,但这似乎是将短路作为一个概念抛弃。
答案 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
,则会在每种情况下评估每个语句。这就是短路运营商OrElse
和AndAlso
的用途。如果使用OrElse
,If语句会在检测到第一个真实语句后停止评估(如果是AndAlso
,则停止第一个false语句。)
因此,在您的情况下,无论如何都会执行到十进制的转换。短路操作员可以避免这种情况。