2015-04-15 35 views
0
function test1{ 
    param([System.Collections.ArrayList]$x 
    ) 
    $x.Add("Test1Add") 
    write "in Test1 $x" 
} 
$x=New-Object System.Collections.ArrayList 

路過此處引用類型參數是我的代碼後,我跑測試1,結果將是:在PowerShell中

PS C:\Windows> test1 $x 
0 
in Test1 Test1Add 

PS C:\Windows> $x 
Test1Add 

我想知道爲什麼會這樣,我想,當調用test1的,它就像傳一個引用類型爲test1的指針,就像C#或其他語言一樣?值類型像int,我必須使用$ script:x來更改gloabl範圍中的x。在此先感謝

+0

你期望發生什麼? – arco444

+0

我首先測試了[int]類型參數,一個值類型,全局範圍內的x沒有改變。然後我嘗試了這個,發現它改變了,所以我想知道我的猜測是否正確 – Vigilantewang

回答

0

使用Reference variables

$x=New-Object System.Collections.ArrayList 
    function test([ref][System.Collections.ArrayList]$x) { $x.value.Add($(get-random)) } 
    test ([ref]$x) 
    test ([ref]$x) 
    $x 

編輯

我誤解了這個問題,你想要的對面。結果與上述情況相同,但不適用於值類型。如果你想讓上面的函數不改變被引用的對象,你需要在函數中克隆它。可能有Clone函數,但在某些情況下,您將不得不手動創建克隆。在這種情況下,有這樣的方法,所以你可以在上面的函數開始處添加$x=$x.Clone()以獲得所需的結果。

Value types作爲值傳遞,其他事情作爲參考傳遞。檢查var是否爲ValueType的最簡單方法是做$var.GetType().IsValueType

+0

嗨,謝謝你的幫助! [ref]對於value類型參數會很有幫助,以前不知道。但在這種情況下,即使不使用參考變量,變量x也會改變。所以我猜如果變量包含一個引用類型的對象,它不需要[ref]。我對嗎? – Vigilantewang

+0

查看我的編輯... – majkinetor

+0

是的,這就是我所需要的,非常感謝。祝您有美好的一天! – Vigilantewang