首页 > 解决方案 > “|=”运算符缓存静态字段值?

问题描述

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

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。

标签: c#operators

解决方案


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

_value = _value | DoSomething

在您的第一个示例中,您设置tmp为任何Inspect返回 - false。但是,该方法也设置globalChangetrue. 之后 globalChange在下一行进行评估。现在truetrue | false.

第二个例子有点棘手。

文档

该| 即使左侧操作数的计算结果为真,运算符也会计算两个操作数,因此无论右侧操作数的值如何,运算结果都为真。

正如这里提到的,这两个表达式都是从左到右计算的。所以首先_gloablChange被评估,即false,作为它的初始值。然后评估第二个操作数。它也返回false,即使它有一些副作用。然而,这种副作用是无关紧要的,因为之前globalChange已经评估过 的值。因此只是返回。false | falsefalse

||另一方面, - 运算符是短路的,这意味着仅当左侧为 时才评估右侧部分false


推荐阅读