VB.NET IIF函数, 慎用,有坑!C# 三目运算符 a?b:c

3 篇文章 0 订阅

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弱类型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值