使用ByRef时为什么变量应该用“.Value”赋值?

时间:2015-01-02 15:46:35

标签: variables powershell

有什么区别:

$A="Something"

$A.Value="Something"

我发现这仅在使用.Value时才有效:

function main
{
    $A="Original A"
    $B="Original B"

    SetByRef1 ([ref]$A)
    SetByRef2 ([ref]$B)

    $A
    $B

    #output: Changed A
    #output: Original B
}


function SetByRef1([ref]$A)
{
    $A.Value = "Changed A"
}

function SetByRef2([ref]$B)
{
    $B = "Changed B"
}

main

我想,$B = "Changed B"正在定义一个新变量B,而$A.Value = "Changed A"只是在改变内容,但我还没有找到确认。

(我确定这是重复的,但我还没有找到它)

1 个答案:

答案 0 :(得分:5)

在函数中使用引用变量时,必须使用.Value与原始对象进行交互,如About_Ref

中所示
PS C:\ps-test> function double
>> {
>>     param ([ref]$x) $x.value = $x.value * 2
>> }

如果在功能内部检查对象,您可以看到差异。在函数SetByRef1内,我添加了以下行。

$a.GetType().FullName
$a.value.GetType().FullName

哪个网络输出以下内容。

System.Management.Automation.PSReference`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
System.String

$a.value的类型表明您正在对原始对象进行操作。