【问题标题】:Why variables should be assigned with ".Value" when using ByRef?为什么在使用 ByRef 时要给变量赋值“.Value”?
【发布时间】:2015-01-02 15:46:35
【问题描述】:

有什么区别:

$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" 只是在更改内容,但我还没有找到确认。

【问题讨论】:

  • 您正在寻找的答案应该在About_Ref 中。尝试更改对象时使用.Value 似乎只是事实。类型从字符串变为 System.Management.Automation.PSReference 而在 SetByRef1 仅供参考。
  • 当你使用解引用操作符时,这真的就像在 C++ 中一样吗?

标签: variables powershell


【解决方案1】:

在函数中使用引用变量时,您必须使用.ValueAbout_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 的类型表明您正在对原始对象进行操作。

【讨论】:

    猜你喜欢
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2011-12-22
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2017-04-04
    相关资源
    最近更新 更多