我最近学到了IIF(A,B,C)函数。我是一个很长的时间VB / VB.NET编码器谁最近花了很多时间来加快sql编码。
在sql中执行的一个(显而易见的)常见事情是类似于以下内容:
select (case where @var = 0 then MyTable.Val1 else MyTable.Val2 end) from MyTable
IIF(A,B,C)将允许我在VB.NET …这一切都在一行。
然而,我已经读到,无论A评估,B和C都被评估。
我可以想到一些明显的情况,这是一件坏事,如:
Dim X as integer = IIF(SomeBoolean = true,ExpensiveFunction1(),ExpensiveFunction2())
正如我将把这包括在我的剧目,有什么更微妙的情况下,我可能会陷入麻烦使用IIF?
在一些情况下,使用老式的是一个相当大的离开:
Dim X as integer if SomeBoolean = true then X = ExpensiveFunction1() else X = ExpensiveFunction2() end if
更新2016
在过去几年中,存在一个新的VB.NET功能,消除了使用IIF()函数的需要。
if(Something = true,ExecuteA(),ExecuteB())
只执行ExecuteA()或ExecuteB()。最后,内联IF与短路。
所以,如果你使用VB.NET的更高版本(截至2016年),如果你可以使用这个。
这是最常见的。
Z = iif(y=0,x/y) 'Throws a divide by zero exception when y is 0
不要使用它来避免除以零错误。
另一个可能的逻辑错误是当iif的一方或另一方调用修改系统状态或具有输出参数的方法时。
Z = iif(FunctionA(InputOutputParam),FunctionB(InputOutputParam)) 'InputOutputParam is indeterminate or at least ambiguous here.
在我的经验中,没有什么好的理由使用IIF。主要是它只是用来缩写代码,并给出了它可能导致的问题,它只是不值得。另外,我认为它使代码更难读。
bites的另一件事是,它返回一个Boxed值(即一个Object数据类型),你必须将它转换回所需的类型。