如果条件简化

con*_*boy 2 c# algorithm logic if-statement conditional-statements

我正在重构一个代码片段,在其中我看到了以下条件,我想知道它是否被简化了。

data.RecordId != 0 || (data.RecordId == 0 && data.SerialNum == "0000")
Run Code Online (Sandbox Code Playgroud)

不是data.RecordId == 0 || data.SerialNum == "0000"一样吗?

如果可能的话,怎么可能?能详细点吗?

Fal*_*der 5

是的,这是可能的,假设你有一个错字(!= 不是 ==)...

让 Wolfram Alpha 解释一下:

https://www.wolframalpha.com/input/?i=simplify%3A+R+%21%3D+0+%7C%7C+%28R+%3D%3D+0+%26%26+S%3D%3D +0000%29

R!=0 ? (R = 0?S = 0)

被简化为:

R!=0 ? S = 0

一步一步的解释:

https://en.wikipedia.org/wiki/Boolean_algebra#Laws 分布?超过 ?说:

x v (y ? z) = (x ? y) ? (x ? z)
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

R! ? (R ? S) = (R! ? R) ? (R! ? S)
Run Code Online (Sandbox Code Playgroud)

where(R! ? R)始终为真,您可以将其省略为 and 逻辑中的第一个操作数:

R! ? (R ? S) = true ? (R! ? S)

R! ? (R ? S) =  (R! ? S)
Run Code Online (Sandbox Code Playgroud)

但是我看到了另一种运行时差异,它处理 的快捷方式评估&&

如果 data.RecordId == 0 在较长的表达式中为 false,则不会使用 data.SerialNum 评估正确的部分,这可以避免获得 null ref。