我是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
?
答案 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的引用。