PowerShell での Null 合体 質問する

PowerShell での Null 合体 質問する

PowerShell に null 合体演算子はありますか?

PowerShell で次の C# コマンドを実行できるようにしたいと思います:

var s = myval ?? "new value";
var x = myval == null ? "" : otherval;

ベストアンサー1

PowerShell 7以上

Powershell 7では、Powershell のネイティブ null 合体、null 条件付き代入、および三項演算子。

ヌル合体

$null ?? 100    # Result is 100

"Evaluated" ?? (Expensive-Operation "Not Evaluated")    # Right side here is not evaluated

ヌル条件代入

$x = $null
$x ??= 100    # $x is now 100
$x ??= 200    # $x remains 100

三項演算子

$true  ? "this value returned" : "this expression not evaluated"
$false ? "this expression not evaluated" : "this value returned"

以前のバージョン:

Powershell コミュニティ拡張機能は必要ありません。標準の Powershell if ステートメントを式として使用できます。

variable = if (condition) { expr1 } else { expr2 }

したがって、最初の C# 式の置き換えは次のようになります。

var s = myval ?? "new value";

次のいずれかになります (好みに応じて)。

$s = if ($myval -eq $null) { "new value" } else { $myval }
$s = if ($myval -ne $null) { $myval } else { "new value" }

または、$myval に含まれる内容に応じて、以下を使用することもできます。

$s = if ($myval) { $myval } else { "new value" }

2 番目の C# 式も同様にマッピングされます。

var x = myval == null ? "" : otherval;

なる

$x = if ($myval -eq $null) { "" } else { $otherval }

公平に言えば、これらはそれほど高速ではなく、C# フォームほど使い心地は良くありません。

読みやすくするために、非常に単純な関数でラップすることも検討してください。

function Coalesce($a, $b) { if ($a -ne $null) { $a } else { $b } }

$s = Coalesce $myval "new value"

または、IfNull: のようにもなります。

function IfNull($a, $b, $c) { if ($a -eq $null) { $b } else { $c } }

$s = IfNull $myval "new value" $myval
$x = IfNull $myval "" $otherval

ご覧のとおり、非常に単純な関数でも、構文の自由度はかなり高まります。

更新: 組み合わせて検討すべきもう 1 つのオプションは、より汎用的な IsTrue 関数です。

function IfTrue($a, $b, $c) { if ($a) { $b } else { $c } }

$x = IfTrue ($myval -eq $null) "" $otherval

次に、演算子に似たエイリアスを宣言する Powershell の機能を組み合わせると、次のようになります。

New-Alias "??" Coalesce

$s = ?? $myval "new value"

New-Alias "?:" IfTrue

$ans = ?: ($q -eq "meaning of life") 42 $otherval

明らかに、これはすべての人の好みに合うものではないでしょうが、あなたが探しているものかもしれません。

Thomas が指摘しているように、C# バージョンと上記のバージョンのもう 1 つの微妙な違いは、C# では引数の短絡が実行されるのに対し、関数/エイリアスを含む Powershell バージョンでは常にすべての引数が評価されることです。これが問題になる場合は、if式形式を使用してください。

おすすめ記事