单个If语句中双IsNot Nothing的逻辑问题及基础计算需求
搞定这个If语句逻辑!
嘿,我明白你要实现的需求:需要判断DrainLeftFound或DrainRightFound是否至少有一个非空——只要其中一个不为空,就执行后续逻辑:包括计算TotalFoundationLength,而且当只有其中一个非空的时候,还要额外累加FoundationArea。你提到用IsNot Nothing时遇到了第一个条件为空的问题,我给你整理了两种可靠的实现方式,帮你避开坑:
方式一:直观分支写法(推荐新手)
这种写法逻辑一目了然,不容易出错,能清晰区分“单个条件成立”和“两个都成立”的场景:
' 核心判断:只要任一对象非空就进入逻辑 If DrainLeftFound IsNot Nothing OrElse DrainRightFound IsNot Nothing Then ' 第一步:不管单个还是两个都成立,先计算TotalFoundationLength TotalFoundationLength = ' 这里填入你的长度计算逻辑 ' 第二步:判断是否只有一个对象非空,是的话累加FoundationArea If (DrainLeftFound IsNot Nothing Xor DrainRightFound IsNot Nothing) Then FoundationArea += ' 这里填入要累加的面积值 End If End If
关键细节提醒:
- 用
OrElse而非Or:OrElse是短路求值——如果第一个条件DrainLeftFound IsNot Nothing为True,就不会再去判断第二个条件,不仅能提升性能,还能避免后续如果要访问对象属性时可能出现的空引用问题(虽然这里只是判断非空,但养成好习惯很重要)。 Xor的妙用:这个运算符正好对应“两个条件中恰好有一个成立”的场景,完美匹配你“单个条件成立时累加面积”的需求。
方式二:简洁变量存储写法(适合追求代码紧凑的场景)
先把两个对象的非空判断结果存成布尔变量,让后续逻辑更清爽:
' 先把判断结果存起来,让逻辑更清晰 Dim isLeftDrainPresent As Boolean = DrainLeftFound IsNot Nothing Dim isRightDrainPresent As Boolean = DrainRightFound IsNot Nothing If isLeftDrainPresent OrElse isRightDrainPresent Then ' 计算总基础长度 TotalFoundationLength = ' 你的长度计算逻辑 ' 单个排水口存在时累加面积 If isLeftDrainPresent Xor isRightDrainPresent Then FoundationArea += ' 你的面积累加值 End If End If
你之前遇到问题的可能原因
如果之前用IsNot Nothing时出错,大概率是误用了Or代替OrElse——Or会强制判断两个条件,哪怕第一个已经为空;另外也可能是判断单个条件成立时逻辑写错了(比如用了And或者错误的Or),用上面的Xor就能完美解决这个问题。
另外别忘了确保TotalFoundationLength和FoundationArea这两个变量已经正确初始化,避免出现未赋值的运行时错误哦!
内容的提问来源于stack exchange,提问作者ritesh khadka
相关产品推荐
相关产品推荐

