$ null是否应位于等式比较的左侧? (带有数组的-eq)

时间:2019-10-03 11:09:34

标签: powershell

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

$abc = $null
$null -eq $abc
True
$abc -eq $null
True

一切正常

$abc = 6,7,$null,8,9
$null -eq $abc
False
$abc -eq $null
*No output*

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

2 个答案:

答案 0 :(得分:5)

执行比较操作时,PowerShell将评估操作的 first 操作数,以确定它是 collection 还是 scalar 值。如果是标量,它将把操作数彼此比较为整个对象。

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

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

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

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

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>

第二个和第三个示例之间的关键区别。除非您完全了解,否则第二个操作数始终是 还是从不 $null,否则您将无法信任比较操作的输出

另一方面,如果两个操作数都是集合,则-eq在每种情况下都会返回$null,因为您不能使用-eq来比较集合。

因此要回答这个问题,通常将$null放在左侧是一个好习惯,因为在比较操作中使用$null时,假定想要比较标量值。如果这个假设是错误的,那么$null可能会更好地放在另一侧,但这不太可能。

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

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

答案 1 :(得分:0)

-eq与左侧的数组不同。很多运营商。

1,2,3 -eq 2

输出:

2

因此,在您的情况下,它返回的不是$ 2,因为$ null在数组中。