Unity中C#代码逻辑异常排查:||运算符与空值判断问题
问题原因分析与修复方案
你的代码存在两个核心问题,导致逻辑完全不符合预期:
赋值/比较运算符混淆
代码里误用了赋值符号=,而非判断相等的比较符号==:ScriptB.giveCookie = true是将true赋值给giveCookie变量,不是判断它是否等于true;ScriptB = null是直接把ScriptB设置为null,不是判断它是否为空。
这会直接修改变量值,彻底偏离你原本的判断逻辑。
空引用风险与逻辑顺序错误
就算改成比较运算符,原逻辑的执行顺序也会引发崩溃:如果ScriptB为空,先执行ScriptB.giveCookie的访问会触发空引用异常,程序直接终止,根本走不到判断ScriptB == null的分支。因为逻辑或||是从左到右执行的,左边表达式抛出异常时,右边代码不会执行。
修复后的代码(两种可选方式)
方式一:调整逻辑顺序,利用短路特性
if(ScriptB == null || ScriptB.giveCookie) { GiveCookie(); }
这里先判断ScriptB是否为空,若为真则直接执行后续逻辑,不会触发空引用;若不为空,再判断giveCookie的值(布尔值无需和true比较,直接写变量名更简洁)。
方式二:使用空条件运算符(C# 6.0+支持)
if(ScriptB?.giveCookie != false || ScriptB == null) { GiveCookie(); }
ScriptB?.giveCookie会在ScriptB为空时返回null,和false比较后,结合空判断实现预期逻辑。
内容的提问来源于stack exchange,提问作者g1761156
相关产品推荐
相关产品推荐

