在Powershell中对Nulls感到困惑

时间:2013-05-31 00:30:00

标签: powershell

我是Powershell的新手,我对某些事情感到困惑,更具体地说是null$null

例如。假设你有一个功能:

function myFunction([ref]$foo){

if($foo -ne $null){
  ...do stuff
}
}

当你调用这个函数时,你会这样做:

[ref]$foo = $null
myFunction $foo

如果您执行上述代码,则条件if($foo -ne $null)将返回true

但是,如果你调用的函数如下:

$foo = $null

myFunction $foo

条件if($foo -ne $null)将返回false

这是为什么?为什么在分配ref变量$null时,在检查时不会将其视为null

2 个答案:

答案 0 :(得分:3)

当您尝试将$null存储在强类型变量中时,PowerShell似乎会将PS C:\> [ref]$foo = $null PS C:\> $foo Value ----- PS C:\> $foo.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False PSReference System.Object 转换为某些非空值。我相信这是原因。请注意以下事项:

$null

PowerShell似乎正在向PSReference投射PS C:\> [String]$str = $null PS C:\> $str -eq $null False PS C:\> $str -eq [String]::Empty True 。我见过类似的字符串行为:

[String]

当我在一个函数上有一个$null参数而我默认为[String]::IsNullOrEmpty并且我的空检查永远不是真的时,它让我感到困惑。

他们为什么要这样做?我想知道同样的事情。

对于字符串,我最终使用PSReference(虽然可能有更多的PowerShell-ish方式)。对于PS C:\> [ref]$foo = $null PS C:\> $foo.Value -eq $null True Value可能符合您对空检查的需求:

Value

请注意,我们刚刚证明您访问{{1}}时不会遇到空引用错误。

答案 1 :(得分:1)

因为$ null是一个特殊的变量,实际上是null,其中[ref] $ foo是一个强类型变量,包含对某个位置的引用,恰好是null。

当然,$ ref -ne $ null。 $ null是null,$ ref是一个稍后可能为null的引用。