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
Изменена только переменная ссылочного типа.