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


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

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

См. также раздел

about_Variables

about_Environment_Variables

about_Functions

about_Script_Blocks

about_Scopes