tech.guitarrapc.cóm

Technical updates

PowerShellにおけるnull扱いの確認

bleisさん[C++][Java][C#][F#][JSX]null の扱いエントリーを見てPowerShellのnull扱いをちょっと確認してみました。 

PowerShellでnullを呼び出すとどうなるのか

結論からいうと、PowerShellはnullを呼び出してもエラーとはなりません。

※PowerShellのnullは$nullです

function f{
param ($n)
switch ($n -eq $null)
    {
    $true {Write-Host "this is null"}
    $false {Write-Host "this is NOT null"}
    }
}
$n = $null
f($n) #this is null

蛇足ですが、PowerShellでは、事前定義せずいきなり用いた変数は自動的にnull扱いです。。

$a = $null
$z -eq $a #True

nullに該当する変数宣言は何のか?

各型で変数宣言して$nullと比較するとこのように…

function f{
param ($a)
switch ($a -eq $null) 
    {
    $true {Write-Host "this is null"}
    $false {Write-Host "this is NOT null"}
    }
}
$a = ""
f($a) #this is NOT null
$b = 0
f($b) #this is NOT null
$c = @{}
f($c) #this is NOT null
$d = $()
f($d) #this is null
$e = $null
f($e) #this is null

14/Dec/2012 追記 こっちの方が便利? 誰得という突っ込みはわわわわ

function f{
$arrays = @()
$arrays += $args | foreach {$_}

foreach ($array in $arrays){
    switch ($array -eq $null) 
        {
        $true {Write-Host "$array : this is null"; continue;}
        $false {Write-Host "$array : this is NOT null"; continue;}
        }
    }

}
$a = ""
$b = 0
$c = @{}
$d = $()
$e = $null

f $a $b $c $d $e

<#
#出力結果#
 : this is NOT null #$aの結果
0 : this is NOT null #$bの結果
System.Collections.Hashtable : this is NOT null #$cの結果
 : this is null #$dの結果
 : this is null #$eの結果
#>

18/Dec/2012 追記 Swtichの使い方見直しましたorz 上のは酷い

function f{

switch ($args) 
    {
    $null {Write-Host "$_ : this is null"; continue;}
    default {Write-Host "$_ : this is NOT null"; continue;}
    }
}
$a = ""
$b = 0
$c = @{}
$d = $()
$e = $null

f $a $b $c $d $e

<#
#出力結果#

 : this is NOT null #$aの結果
0 : this is NOT null #$bの結果
System.Collections.Hashtable : this is NOT null #$cの結果
 : this is null #$dの結果
 : this is null #$eの結果
#>

nullを各型にCASTするとどうなるのか?

逆にnullを型変換するとこのようになります。

function f{
param ($a)
    [string]$s = $a
    [char]$c = $a
    [int]$i = $a 
    [bool]$b = $a
    [PSObject]$p =
    [object]$o = $a
    $s #""(空の文字列)
    $c #'`'(空の文字列)
    $i #0(対応する数値型の0に対応するオブジェクト)
    $b #false
    $p $a #$null
    $o #$null
}
$a = $null
f($a)

まとめ

結構嫌な感じですね。