奇怪的 StringBuilder

4

我在函数中有一个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()

输出:

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?????

为什么所有时间都是四倍数?为什么对象不是字符串?

1个回答

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()

解释是,$stringBuilder.AppendLine()输出了一些内容,并将其添加到函数的输出中。
编辑: 函数输出的所有内容都被视为函数的返回值。换句话说,在PowerShell中,函数的返回值不仅是return关键字后面的值($out),而且还包括函数内部输出的所有数据(以数组形式)。查看about_Return,我们可以看到:

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


可以了,谢谢。但我不明白:$out是一个新的字符串对象... - Andrew Semenov
@AndrewSemenov AppendLine() 函数返回一个对 StringBuilder 本身的引用,如果您检查 $out2[0].GetType(),您会发现它是 StringBuilder 类型。 - Mathias R. Jessen
我编辑了人的回答,解释了返回值不仅是 $out,而且包括函数内部输出的所有数据。 - JPBlanc
Return关键字的主要目的是强制从函数立即退出。与其一起指定的任何值都是可选的和偶然的。 - mjolinor
这是需要讨论的问题。从结构化编程中最常见的偏差是从函数或循环中提前退出。即使PowerShell可以将每个输出都视为返回值,我更喜欢在最后返回单个对象,这样更易读,更适合维护。 - JPBlanc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接