使用引用类型变量

Using reference type variables

提问人:Philosophene 提问时间:8/5/2023 更新时间:8/5/2023 访问量:48

问:

可能是星期五将近下午 5 点,但我在学习如何在 PowerShell 中使用类型变量时遇到了麻烦。[ref]

以下打印“NotTest”

[ref]$refString = 'Test'
$string = $refString
$refString.Value = 'NotTest'
$string

我感到困惑的是,以下内容不会打印$a、$b或$c的新值:

[ref]$a = 'test'
[ref]$b = 'foo'
[ref]$c = 'bar'
$arguments= "?arg1=" + $a.value + "&arg2=" + $b.value + "&arg3=" + $c.value

$a.Value = 'no'
$b.Value = 'change'
$c.Value = 'Happens'
$arguments

有没有办法正确引用新值?

传递引用PowerShell pass-by-reference

评论

1赞 Santiago Squarzon 8/5/2023
因此,您正在创建一个由引用类型值组成的字符串,然后期望更新引用类型也会更新不可变的字符串?使用逗号创建一个数组而不是字符串,然后它将更新。
0赞 mclayton 8/5/2023
在第二个示例中,变量 和 是变量这一事实是无关紧要的 - 使用该时间点的值计算右侧,结果是一个字符串,而不是动态公式。当 和 的实例值发生更改时,不会重新计算分配给的字符串。考虑一个类似的程序 - - 您希望将什么输出到控制台?(剧透警告:“X 的值为 1”:-))$a$b$c[ref]$arguments = …$a$b$c$arguments$x = 1; $s = “value of x is “ + $x; $x = 2; write-host $s

答:

0赞 Santiago Squarzon 8/5/2023 #1

在第一个示例中,它与(可变类型)具有相同的引用,而在第二个示例中,您通过将字符串与 s 的(也是不可变字符串)连接起来构造字符串(不可变类型),这意味着它是不可变的。更新 的值不会影响已构造的字符串。$string$refStringPSReference$argumentsPSReference

从你所拥有的外观和一些猜测来看,我认为 UriBuilderHttpUtility.ParseQueryString 就是你所追求的:

if (-not $IsCoreCLR) {
    Add-Type -AssemblyName System.Web
}

$builder = [System.UriBuilder]::new('myurlhere')
$query = [System.Web.HttpUtility]::ParseQueryString('')
$query['args1'] = 'test'
$query['args2'] = 'foo'
$query['args3'] = 'bar'
$builder.Query = $query.ToString()
$builder.Uri.ToString()
# Outputs: http://myurlhere/?args1=test&args2=foo&args3=bar

$query['args1'] = 'changes'
$query['args2'] = 'happen'
$query['args3'] = 'here'
$builder.Query = $query.ToString()
$builder.Uri.ToString()
# Outputs: http://myurlhere/?args1=changes&args2=happen&args3=here