如何避免评估所有'iif'表达式?

时间:2012-11-21 13:22:06

标签: .net vb.net casting lazy-evaluation iif

是VB.NET 2005,有没有一种方法可以执行以下操作而不会在尝试将空字符串转换为整数时抛出invalid cast exception

Dim strInput As String = String.Empty
Dim intResult As Integer = IIf(IsNumeric(strInput), CInt(strInput), 100)

3 个答案:

答案 0 :(得分:8)

VB.NET现在有一个真正的三元运营商(2008年之后)

Dim intResult = If(IsNumeric(strInput), CInt(strInput), 100)

这与IIF不同,因为它使用了短路评估 如果测试表达式的计算结果为true,则忽略FalsePart或反之亦然

正如Marek Kembrowsky先生在评论中所说,IIF是一个函数,它的参数在传入之前都被评估,而IF(作为三元运算符)是VB编译器的附加功能。

但是,当我在VB.NET中编程时,我不喜欢使用Microsoft.VisualBasic兼容命名空间提供的快捷方式。框架提供了更好的解决方案,如TryParse方法集。如果输入字符串超过Integer.MaxValue,则示例将失败。

更好的方法可能是

Dim d As decimal
if Not Decimal.TryParse(strInput, d)  then d = 100

或者,如果你有一个浮点string(好的,你明白我的意思)

Dim d As Double
if Not Double.TryParse(strInput, d)  then d = 100

答案 1 :(得分:1)

如果解决方案可行......但IsNumeric()不是正确的检查。如果strInput是一个数字但超过integer.maxvalue怎么办?更好地使用TryParse。

Dim i As Integer
If Not Integer.TryParse("1234567890", i) Then i = 100

Dim j As Integer = If(Integer.TryParse("123456789", Nothing), Integer.Parse("123456789"), 100)

答案 2 :(得分:0)

解决问题的方法之一是:

Dim strInput As String = String.Empty
Dim intResult As Integer = IIf(IsNumeric(strInput), strInput, 100)

这种方式是隐式完成转换,并且不存在任何无效的转换异常。