$null 应该在等式比较的左侧吗?(-eq 带数组)

use*_*807 10 powershell

和同事讨论,应该$null在支票的左边还是右边?为什么这很重要的任何例子?

$abc = $null
$null -eq $abc
True
$abc -eq $null
True
Run Code Online (Sandbox Code Playgroud)

一切都好

$abc = 6,7,$null,8,9
$null -eq $abc
False
$abc -eq $null
*No output*
Run Code Online (Sandbox Code Playgroud)

有人可以解释比较数组时发生了什么吗?

Slo*_*ire 9

执行比较操作时,PowerShell 将评估该操作的第一个操作数,以确定它是集合还是量值。如果它是标量,它会将操作数作为整个对象相互比较。

2 -eq 1,2,$null,3
False

$null -eq 1,2,$null,3
False

4 -eq 1,2,$null,3
False
Run Code Online (Sandbox Code Playgroud)

如果它是一个集合,它将遍历集合,将每个元素与第二个操作数进行比较,如果找到匹配项,则返回第二个操作数的值。

1,2,$null,3 -eq 2
2

1,2,$null,3 -eq $null
<nothing appears, indicating returned value is $null>

1,2,3 -eq 4
<nothing appears, indicating returned value is $null>
Run Code Online (Sandbox Code Playgroud)

第二个和第三个例子之间的主要区别。除非您绝对知道第二个操作数是always还是never $null,否则您不能相信比较操作的输出。

附带说明一下,如果两个操作数都是集合,则在每种情况下都-eq返回$null,因为您不能用于-eq比较集合。

所以要回答这个问题,通常把$null左边放在左边是个好习惯,因为$null在比较操作中使用时,假设您要比较标量值。如果这个假设是错误的,那么$null放在相反的一边可能会更好,但这不太可能。

相反,我总是放在$null右边,因为我在上述假设下编写代码 -当比较操作中明确提到时,我总是比较标量值$null。这样,当我得到一个非布尔值返回时,我知道我没有在等式中正确访问我的集合对象。然而,我陷入了陷阱,所以我的编码实践可能会通过改变我的方式得到更好的服务。

总之,就像任何编码实践一样,这是一个见仁见智的问题。如果我教 PowerShell,我会教这种做法。然而,我发现我不太可能改变我的煽动方式。

  • 并且`1,$null,$null,3 -eq $null`返回`$null,$null`,这是一个有2个元素的集合,这是真值(`if(1,$null,$null,3 - eq $null){ Do-Something }` 将执行 if 块)。 (3认同)