2013-05-31 79 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。