2

我是 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它?

4

2 回答 2

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

[String]当我在一个我默认使用的函数上有一个参数$null并且我的空检查永远不会是真的时,这让我很困惑。

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

对于字符串,我最终使用了[String]::IsNullOrEmpty(尽管可能有更类似于 PowerShell 的方式)。对于PSReference,Value可能适合您对空值检查的需要:

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

请注意,我们刚刚证明您不会通过访问Value.

于 2013-05-31T03:50:13.433 回答
1

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

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

于 2013-05-31T03:23:17.320 回答