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

CJ7*_*CJ7 1 .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)
Run Code Online (Sandbox Code Playgroud)

Ste*_*eve 8

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

Dim intResult = If(IsNumeric(strInput), CInt(strInput), 100)
Run Code Online (Sandbox Code Playgroud)

这与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
Run Code Online (Sandbox Code Playgroud)

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

Dim d As Double
if Not Double.TryParse(strInput, d)  then d = 100
Run Code Online (Sandbox Code Playgroud)