Поделиться через


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или outref параметр, он ожидает ссылку.

[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

Изменена только переменная ссылочного типа.

См. также