2014-10-03 25 views
3
參考

可能有人請解釋爲什麼更新的財產不被該示例中的函數退出後持續低於爲什麼當我通過它在PowerShell中

function CreateConfigObject 
{ 
    # base solution directory 
    $Config = New-Object -typename PSObject 

    # Build Config File Contents 
    $Config | Add-Member -Name MyProperty -MemberType NoteProperty -Value "Original Value" 

    return $Config 
} 

function MyFunction([ref]$obj) 
{ 
    Write-Host "Inside function Before Updating : " $obj.Value 
    Write-host "Are the objects equal? " $obj.Value.Equals($config.MyProperty) 

    $obj.Value = "New Value" 
    Write-Host "Inside function After Updating : " $obj.Value 

} 



$config = CreateConfigObject 

Write-Host "Before calling function : " $config.MyProperty 

MyFunction ([ref]$config.MyProperty) 

Write-Host "After calling function : " $config.MyProperty 

回答

4

花了一點這個屬性不被更新的計算,但我有一個答案。 [ref]將一個對象,而不是一個值傳遞給一個函數。因此,您需要做的是將$config傳遞給函數,然後引用它的值以及該值的.MyProperty屬性。看看這個稍微改變代碼,看看我的觀點:

function CreateConfigObject 
{ 
    # base solution directory 
    $Config = New-Object -typename PSObject 

    # Build Config File Contents 
    $Config | Add-Member -Name MyProperty -MemberType NoteProperty -Value "Original Value" 

    return $Config 
} 

function MyFunction([ref]$obj) 
{ 
    Write-Host "Inside function Before Updating : " $obj.value.MyProperty 
    Write-host "Are the objects equal? " $obj.value.MyProperty.Equals($config.MyProperty) 

    $obj.value.MyProperty = "New Value" 
    Write-Host "Inside function After Updating : " $obj.value.MyProperty 

} 



$config = CreateConfigObject 

Write-Host "Before calling function : " $config.MyProperty 

MyFunction ([ref]$config) 

Write-Host "After calling function : " $config.MyProperty 

將輸出的預計業績:

Before calling function : Original Value 
Inside function Before Updating : Original Value 
Are the objects equal? True 
Inside function After Updating : New Value 
After calling function : New Value 
+0

既然你是路過的父對象,你不需要'[參考]'任何更多。 – 2014-10-19 23:46:45

+0

@EmperorXLII對,你不需要它在函數上,但是當你調用被引用對象的函數時,它仍然是必需的。所以'MyFunction($ obj)'是好的,但你仍然需要'MyFunction([ref] $ config)' – TheMadTechnician 2014-10-20 16:36:23

+0

對不起,我的意思是'[ref]'可以從函數和調用站點中刪除。你只需要'[ref]'來改變變量的目標。例如,如果你有'函數f($ h){$ h ['a'] ='b'}'和一個散列表'$ v',調用'f $ v'將會添加一個元素到hashtable中, [ref]'(就像'MyFunction'可以在不使用'[ref]'的情況下設置'MyProperty')。另一方面,如果你有'函數g([ref] $ h){$ h.Value = @ {'c'='d'}}'和'$ w = $ null',你需要使用' g([ref] $ w)'爲了得到結果到'$ w'。 – 2014-10-20 23:50:24

相關問題