奇怪的StringBuilder

And*_*nov 4 powershell stringbuilder

我在函数里面有StringBuilder对象.返回前有字符串类型,后面有一些System.Object.

function test
{
    $strArr = @("aaa", "bbb", "ccc")
    $stringBuilder = New-Object System.Text.StringBuilder
    foreach ($item in $strArr)
    {
        $stringBuilder.AppendLine($item)            
    }
    $out = $stringBuilder.ToString()
    write-host "FIRST OUT: ", $out, "OUTTYPE:", $out.GetType()
    return $out
}

$out2 = test
Write-Host "-------------------"
write-host "SECOND OUT2: ", $out2, "OUT2TYPE:", $out2.GetType()
Run Code Online (Sandbox Code Playgroud)

输出:

FIRST OUT:  aaa
bbb
ccc
 OUTTYPE: System.String -> THAT'S OK
-------------------
SECOND OUT2 (ALL ARE four times - WHY???):  aaa
bbb
ccc
 aaa
bbb
ccc
 aaa
bbb
ccc 
 aaa
bbb
ccc
 OUT2TYPE: System.Object[] -> Object?????
Run Code Online (Sandbox Code Playgroud)

为什么都是四次?为什么对象不串?

JPB*_*anc 5

试试这个:

function test

    {
    $strArr = @("aaa", "bbb", "ccc")
    $stringBuilder = New-Object System.Text.StringBuilder
    foreach ($item in $strArr)
    {
        $stringBuilder.AppendLine($item) | Out-Null           
    }
    $out = $stringBuilder.ToString()
    write-host "FIRST OUT: ", $out, "OUTTYPE:", $out.GetType()
    return $out
}

$out2 = test
Write-Host "-------------------"
write-host "SECOND OUT2: ", $out2, "OUT2TYPE:", $out2.GetType()
Run Code Online (Sandbox Code Playgroud)

解释是$stringBuilder.AppendLine()输出的东西,它被添加到函数的输出中.


编辑:函数输出的所有内容都被视为函数的返回.换句话说,在PowerShell中,函数的返回值不仅是returnkeywork($ out)之后的值,而且是函数内部的所有数据(以数组形式).看看about_Return,我们看到了

在Windows PowerShell中,即使没有包含Return关键字的语句,每个语句的结果也会作为输出返回.