Udostępnij za pomocą


Unikanie przypisywania zmiennych w wyrażeniach

Program PowerShell umożliwia używanie przypisań w wyrażeniach przez dołączenie przypisania w nawiasach (). Program PowerShell przekazuje przypisaną wartość za pośrednictwem. Na przykład:

# 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

Uwaga

Chociaż ta składnia jest dozwolona, nie zaleca się używania jej. Istnieją przypadki, w których nie działa to, a intencja autora kodu może być myląca dla innych recenzentów kodu.

Ograniczenia

Przypadek przypisania nie zawsze działa. Gdy to nie zadziała, przypisanie zostanie odrzucone. Jeśli utworzysz wystąpienie typu wartości modyfikowalnej i spróbujesz zapisać wystąpienie w zmiennej i zmodyfikować jedną z jego właściwości w tym samym wyrażeniu, przypisanie właściwości zostanie odrzucone.

# 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

Różnica polega na tym, że nie można zwrócić odwołania do wartości. ($var = [Foo]::new()) Zasadniczo element jest odpowiednikiem $($var = [Foo]::new(); $var). Nie wykonujesz już dostępu do składowej w zmiennej, do której uzyskujesz dostęp członkowski w danych wyjściowych zmiennej, która jest kopią.

Obejście polega na utworzeniu wystąpienia i zapisaniu go w zmiennej, a następnie przypisaniu do właściwości za pomocą zmiennej:

# 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