“|=”运算符缓存静态字段值?
"|=" 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
设置为 true
。 Afterwards 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
时,右边的部分才会被评估。
我有一个有趣的错误,更改未注册。修复是不寻常的。第一个代码工作正常,而第二个 - 没有。
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
设置为 true
。 Afterwards 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
时,右边的部分才会被评估。