about_Ref
Краткое описание
Описывает создание и использование переменной ссылочного типа. Можно использовать переменные ссылочного типа, чтобы разрешить функции изменять значение переменной, передаваемой в нее.
Подробное описание
Переменные можно передавать в функции по ссылке или по значению.
При передаче переменной по значению вы передаете копию данных.
В следующем примере функция изменяет значение переменной, переданной в нее. В PowerShell целые числа являются типами значений, поэтому они передаются по значению.
Таким образом, значение $var
не изменяется за пределами области функции.
Function Test($data)
{
$data = 3
}
$var = 10
Test -data $var
$var
10
В следующем примере переменная, содержащая объект Hashtable
, передается функции. Hashtable
— это тип объекта, поэтому по умолчанию он передается функции по ссылке.
При передаче переменной по ссылке функция может изменить данные, и это изменение сохраняется после выполнения функции.
Function Test($data)
{
$data.Test = "New Text"
}
$var = @{}
Test -data $var
$var
Name Value
---- -----
Test New Text
Функция добавляет новую пару "ключ-значение", которая сохраняется вне области функции.
Запись функций для принятия ссылочных параметров
Вы можете закодировать функции для принятия параметра в качестве ссылки независимо от типа передаваемых данных. Для этого необходимо указать тип параметров как System.Management.Automation.PSReference
или [ref]
.
При использовании ссылок необходимо использовать Value
свойство System.Management.Automation.PSReference
типа для доступа к данным.
Function Test([ref]$data)
{
$data.Value = 3
}
Чтобы передать переменную в параметр, ожидающий ссылку, необходимо ввести переменную в качестве ссылки.
Примечание.
Скобки и скобки являются обязательными.
$var = 10
Test -data ([ref]$var)
$var
3
Передача ссылок на методы .NET
Для некоторых методов .NET может потребоваться передать переменную в качестве ссылки. Если определение метода использует ключевые слова in
или out
ref
параметр, оно ожидает ссылку.
[int] | Get-Member -Static -Name TryParse
Name MemberType Definition
---- ---------- ----------
TryParse Method static bool TryParse(string s, [ref] int result)
Метод TryParse
пытается проанализировать строку как целое число. Если метод успешно выполнен, он возвращается $true
и результат хранится в переменной, переданной по ссылке.
PS> $number = 0
PS> [int]::TryParse("15", ([ref]$number))
True
PS> $number
15
Ссылки и области
Ссылки позволяют изменять значение переменной в родительской области в дочерней области.
# Create a value type variable.
$i = 0
# Create a reference type variable.
$iRef = [ref]0
# Invoke a scriptblock to attempt to change both values.
&{$i++;$iRef.Value++}
# Output the results.
"`$i = $i;`$iRef = $($iRef.Value)"
$i = 0;$iRef = 1
Изменена только переменная ссылочного типа.
См. также
PowerShell