IIf 函数
- 先说说IIF函数是怎么用的, IIF函数是个三目运算符, 其语法:
IIf(判断表达式, 真值部分表达式, 假值部分表达式)
根据判断表达式的值, 当表达式为真时, 返回真值部分; 当表达式为假时, 返回假部分. - 例如:
IIF(1>0,1,0) 1>0为TRUE 所以 整个表达式的值应该为1 .
慎用IIf 函数,其坑
- 用起来不难, 但需要注意的是 IIF函数 是不短路的 , 就是说它是
将后面的两个表达式的值都计算出来 ,才返回值
; 所以用起来要特别注意, 不小心就会出错. - 解释一下短路意思:如
a andalso b
判断是短路的,先运算a,若为False,整个表达式就为False, 是不会继续运算 b的。 - 例如:程序中,某些查询条件是可选的,若用户填写此查询条件,程序查询SQL就加上该条件:
Dim lsUserIDs As String ' ## 此处没有初始化为 = String.Empty 或 = ""
if Session("UserID") <> "" andalso ... then
'..... 模拟一段逻辑: 给 变量 lsUserIDs 赋值
lsUserIDs = "user1, user2, User3"
end if
....
' 拼接查询SQL时
lsSQL = IIf(String.IsNullOrEmpty(lsUserIDs), "", String.Format(" AND UserID IN('{0}')", lsUserIDs.Replace(",", "','")))
' ## 此处IIf 函数有坑 ##
- 当 程序不满足一定条件,没有跑【给变量 lsUserIDs 赋值】这段代码,ls
IIf 语句中的String.IsNullOrEmpty(lsUserIDs)
没有问题,能判断出 lsUserIDs 变量还是为nothing
,但是由于 IIF函数 是不短路的 ,也就是说无论判断表达式真假 ,程序都会对后面 2个表达式进行运算,即程序会先运算lsUserIDs.Replace(",", "','")
,然后才返回""
给 lsSQL .
运算lsUserIDs.Replace(",", "','")
时会报错: Object reference not set to an instance of an object.
即lsUserIDs对象引用未实例化。
- 你可以测试一下
iif(1,4,1/0)
iif(0,1/0,4)
无论哪个都报错,因为假部分表达式中:除数为0,报错。
IIf 函数 相当于在 C# 中
三目运算符, 语法: 表达式 ? 真 : 假
iif(a>b,a,b);
a>b?a:b;
总结
从效率上讲,如果是大运算,这个无疑降低了效率。
从逻辑上讲,如果你前面的代码 对真假部分的参数有赋值的,会出现意料之外的错误。
总而言之,慎用!
听说:iif 函数另一个问题是,它返回的是object弱类型。