2013-05-31 77 views
2

我是Powershell的新手,我对某些东西感到困惑,更具体的是null$null对Powershell中的空值感到困惑

例如。假设你有一个函数:

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

你有没有想过这个? – jpmc26

+0

@ jpmc26嗯,我不记得.... – BlackHatSamurai

回答

3

当您尝试将其存储在强类型变量中时,PowerShell似乎将$null转换为某个非空值。我相信这是事业。请注意以下内容:

PS C:\> [ref]$foo = $null 
PS C:\> $foo 

Value 
----- 



PS C:\> $foo.GetType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  False PSReference        System.Object 

看来,PowerShell是铸造$nullPSReference。我见过类似的行为与字符串:

PS C:\> [String]$str = $null 
PS C:\> $str -eq $null 
False 
PS C:\> $str -eq [String]::Empty 
True 

它混淆了赫克了我,当我对我是默认为$null功能的[String]参数和我的空检查是不正确的。

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

对于字符串,我结束了使用[String]::IsNullOrEmpty(尽管可能有更多的PowerShell-ish方式)。对于PSReferenceValue可能会满足您的需求为空校验:

PS C:\> [ref]$foo = $null 
PS C:\> $foo.Value -eq $null 
True 

注意,我们刚刚证明了你也不会通过访问Value碰上空引用错误。

1

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

所以当然$ ref -ne $ null。 $ null是null,$ ref是一个引用,它可能在以后为null。