“|=”运算符缓存静态字段值?

"|=" operator caches static field value?

我有一个有趣的错误,更改未注册。修复是不寻常的。第一个代码工作正常,而第二个 - 没有。

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 是一个 public 静态字段。 target.Inspect(); 实际上是 returns False。但在内部它会在进行更改时设置 globChanged = true 。我认为运算符“|=”在调用 Inspect(); 函数之前计算 globChanged 的值。我实际上测试了这个 - 在 target.Inspect(); 的末尾 globChanged 是真的。

还有: 无效:

  globChanged = globChanged || pgi.Inspect();   

作品:

globChanged = pgi.Inspect() || globChanged;

澄清一下。不起作用意味着当 globChanged 设置为 True 时 It returns False。 pgi.Inspect();每次都执行,开始时 globChanged 为 False。

表达式value |= DoSomething不过是这样的:

_value = _value | DoSomething

在您的第一个示例中,您将 tmp 设置为任何 Inspect returns - false。但是,该方法还将 globalChange 设置为 trueAfterwards globalChange 在下一行计算。现在是 true,结果是 true | false

第二个例子有点棘手。

来自docs:

The | operator evaluates both operands even if the left-hand operand evaluates to true, so that the operation result is true regardless of the value of the right-hand operand.

如此处所述两个 表达式都是从左到右求值的。因此,首先评估 _gloablChange,即 false,作为其初始值。 之后 计算第二个操作数。它也是 returns false,尽管它有一些副作用。然而,这种副作用是无关紧要的,因为 globalChange 的值在 之前已经被评估 。因此 false | false 只是 returns false.

另一方面,||-运算符是短路的,这意味着只有当左边的部分是 false 时,右边的部分才会被评估。