Hindari menetapkan variabel dalam ekspresi

PowerShell memungkinkan Anda menggunakan penugasan dalam ekspresi dengan menyertakan penugasan dalam tanda kurung (). PowerShell meneruskan nilai yang ditetapkan. Contohnya:

# In an `if` conditional
if ($foo = Get-Item $PROFILE) { "$foo exists" }

# Property access
($profileFile = Get-Item $PROFILE).LastWriteTime

# You can even *assign* to such expressions.
($profileFile = Get-Item $PROFILE).LastWriteTime = Get-Date

Catatan

Meskipun sintaks ini diizinkan, penggunaannya tidak disarankan. Ada kasus di mana ini tidak berfungsi dan niat pembuat kode dapat membingungkan peninjau kode lain.

Batasan

Kasus penugasan tidak selalu berfungsi. Ketika tidak berhasil, tugas akan dibuang. Jika Anda membuat instans jenis nilai yang dapat diubah dan mencoba menyimpan instans dalam variabel dan memodifikasi salah satu propertinya dalam ekspresi yang sama, penetapan properti akan dibuang.

# create mutable value type
PS> Add-Type 'public struct Foo { public int x; }'

# Create an instance, store it in a variable, and try to modify its property.
# This assignment is effectively IGNORED.
PS> ($var = [Foo]::new()).x = 1
PS> $var.x
0

Perbedaannya adalah Anda tidak dapat mengembalikan referensi ke nilai . Pada dasarnya, ($var = [Foo]::new()) setara dengan $($var = [Foo]::new(); $var). Anda tidak lagi melakukan akses anggota pada variabel yang Anda lakukan akses anggota pada output variabel, yang merupakan salinan.

Solusinya adalah membuat instans dan menyimpannya dalam variabel terlebih dahulu, lalu menetapkan ke properti melalui variabel :

# create mutable value type
PS> Add-Type 'public struct Foo { public int x; }'

# Create an instance and store it in a variable first
# and then modify its property via the variable.
PS> $var = [Foo]::new()
PS> $var.x = 1
PS> $var.x
1