閱讀英文

共用方式為


about_Ref

簡短描述

描述如何建立及使用引用類型變數。

詳細描述

您可以藉由傳址傳值,將變數傳遞至函式。 當您依值傳遞變數時,會傳遞數據的複本。 當您以參考方式傳遞變數 時,您傳遞的是對原始值的參考。 這可讓函式變更傳遞給它的變數值。 參考型別是使用 [ref]來建立的,它是 [System.Management.Automation.PSReference] 型別的類型快速建構器。

[ref] 的主要目的是藉由參考標示為 refoutin的 .NET 方法參數,啟用傳遞 PowerShell 變數。 您也可以定義自己的 PowerShell 函式,以接受 [ref] 類型參數。 在此用法中,[ref] 會套用至 變數,而產生的 [ref] 實例可用來間接修改該變數的值。

在下列範例中,函式會變更傳遞給它的變數值。 在 PowerShell 中,整數是實值型別,因此會以傳值方式傳遞。 因此,的值 $var 在函式範圍之外保持不變。

PowerShell
Function Test($data)
{
    $data = 3
}

$var = 10
Test -data $var
$var
Output
10

在下列範例中,包含的 Hashtable 變數會傳遞至函式。 是物件類型,因此預設會透過參考傳遞至函式

以傳址方式傳遞變數時,函式可以變更數據,且該變更會在函式執行之後保存。

PowerShell
Function Test($data)
{
    $data.Test = "New Text"
}

$var = @{}
Test -data $var
$var
Output
Name                           Value
----                           -----
Test                           New Text

函式會新增新的機碼/值組,該組會保存在函式的範圍之外。

撰寫函式以接受參考參數

不論傳遞的數據類型為何,您都可以撰寫函式的程式代碼,以取得參數作為參考。 這需要您將參數類型指定為 [ref]

使用參考時,您必須使用 Value 類型的 屬性 [ref] 來存取您的數據。

PowerShell
function Test {
    param([ref]$data)
    $data.Value = 3
}

若要將變數傳遞至預期參考的參數,您必須輸入將變數轉換成參考。

重要

兩者都需要括弧和括號。

PowerShell
$var = 10
Test -data ([ref]$var)
$var
Output
3

傳遞 .NET 方法的參考

某些 .NET 方法可能需要您將變數傳遞為參考。 當方法的定義使用 關鍵詞 inoutref 參數時,它預期會有參考。

PowerShell
[int] | Get-Member -Static -Name TryParse
Output
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

參考和範圍

參考允許在子範圍內變更父範圍中的變數值。

PowerShell
# 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)"
Output
$i = 0;$iRef = 1

只有參考類型的變數已變更。

使用 [ref] 來作為一般用途物件持有者

您也可以使用 [ref] 作為一般用途物件容器。 在此使用方式中,[ref] 會套用至 ,而不是變數。 值通常是實值類型的實例,例如數位。 在大部分情況下,您可以改用一般變數或參數。 不過,這項技術在不理想或不可能傳遞明確值持有者的情況下很有用,例如在腳本區塊參數值中。

例如,您可以使用 script-block 參數值來計算 NewName 參數的 Rename-Item cmdlet 的值。 Rename-Item cmdlet 可讓您將項目透過管線傳送給它。 此命令會對管線中每項目執行傳遞給 NewName 的腳本區塊。 腳本區塊會在子程式範圍中執行。 直接修改呼叫端範圍中的變數並無濟於事,您無法在此內容中將自變數傳遞至腳本區塊。

在此範例中,傳遞至 NewName 參數的腳本區塊會遞增管線中每個項目的 $iRef 值。 腳本區塊會藉由將數字新增至檔名開頭,以創建新的名稱。

PowerShell
$iRef = [ref] 0
Get-ChildItem -File $setPath |
    Rename-Item -NewName { '{0} - {1}' -f $iRef.Value++,$_.Name }

[ref][System.Management.Automation.PSReference] 之間的差異

參考型別變數是使用 [ref] 型別加速器或直接指定 [System.Management.Automation.PSReference] 型別來建立。 即使 [ref][System.Management.Automation.PSReference]的類型加速器,但它們的行為也不同。

  • 當您使用 [ref] 轉換變數時,PowerShell 會建立參考物件,其中包含變數原始實例的參考。
  • 當您使用 [System.Management.Automation.PSReference] 轉換變數時,PowerShell 會建立包含變數複本的參考物件,而不是原始實例的參考。

例如,下列腳本會建立變數 $x 和兩個參考物件。

PowerShell
PS> $int = 1
PS> $aRef = [ref] $int
PS> $bRef = [System.Management.Automation.PSReference] $int
PS> $int
1
PS> $aRef, $bRef

Value
-----
    1
    1

此時,這兩個參考物件的值都與 $int相同。 藉由將不同的值新增至參考對象,我們可以看到使用 $aRef建立的 [ref]是原始實例 $int的參考。 $bRef是使用 [System.Management.Automation.PSReference]建立的變數複本。

PowerShell
PS> $aRef.Value+=2
PS> $bRef.Value+=5
PS> $int
3
PS> $aRef, $bRef

Value
-----
    3
    6

另請參閱