c# - “|=”运算符缓存静态字段值?
问题描述
我遇到了一个有趣的错误,未注册更改。修复是不寻常的。第一个代码工作正常,而第二个代码 - 没有。
https://rextester.com/PIRZFJ12810
globChanged = false;
bool tmp = target.Inspect();
globChanged |= tmp;
if (globChanged) Debug.LogError("Works!");
这个不行:
globChanged = false;
globChanged |= target.Inspect();
if (globChanged) Debug.LogError("Works!");
我想我有一个怀疑。globChanged
是一个公共静态字段。target.Inspect();
实际上返回 False 。但在内部,它会globChanged = true
在进行更改时设置。我认为运算符“|=”会在调用函数globChanged
之前评估 的值。Inspect();
我实际上对此进行了测试 - 最后target.Inspect();
是globChanged
真实的。
另外:不起作用:
globChanged = globChanged || pgi.Inspect();
作品:
globChanged = pgi.Inspect() || globChanged;
澄清。不起作用意味着当 globChanged 设置为 True 时它返回 False。pgi.Inspect(); 每次都执行,并且 globChanged 在开始时为 False。
解决方案
表达式value |= DoSomething
不过是这样:
_value = _value | DoSomething
在您的第一个示例中,您设置tmp
为任何Inspect
返回 - false
。但是,该方法也设置globalChange
为true
. 之后 globalChange
在下一行进行评估。现在true
是true | false
.
第二个例子有点棘手。
从文档:
该| 即使左侧操作数的计算结果为真,运算符也会计算两个操作数,因此无论右侧操作数的值如何,运算结果都为真。
正如这里提到的,这两个表达式都是从左到右计算的。所以首先_gloablChange
被评估,即false
,作为它的初始值。然后评估第二个操作数。它也返回false
,即使它有一些副作用。然而,这种副作用是无关紧要的,因为之前globalChange
已经评估过 的值。因此只是返回。false | false
false
||
另一方面, - 运算符是短路的,这意味着仅当左侧为 时才评估右侧部分false
。
推荐阅读
- liferay - Liferay - 动态数据列表获取记录 portlet
- ios - 直接将图像共享到 WhatsApp 无法在 iOS 上运行
- javascript - 将按钮 onmouseover 更改为 onclick
- google-cloud-build - 如何将触发器添加到谷歌云构建中的队列?
- android - CameraX 随机崩溃并出现 IllegalStateException
- javascript - 无法使用 Javascript 将新的键值对添加到现有的 json 数组
- ruby - 如果值为0,则返回1,如果值大于0,则返回值的最佳方法是什么
- reactjs - React App:如何实现 Facebook 登录?
- java - 声纳 Java 过滤器抛出 UnsupportedOperationException
- mysql - 为什么我通过子查询的结果得到错误组?