我有一个从中获取的 xml 变量Invoke-restmethod
。我们称之为$object1
我想创建一个新变量或对象$object2
那是一样的$object1
但对值进行了一些更改
这是我尝试过的:
$object2 = $object1
$object2.sweets.candy.Where({$_.lemondrop -gt 1}) | Foreach{$_.gumdrop = 20}
现在的问题是当我仔细检查时$object1
那里的值也改变了......我不想要那个
我只是希望改变继续存在$object2
我在这里做错了什么?
你需要clone $object1
为了获得它的独立副本:
$object2 = $object1.Clone() # assumes that $object's type implements ICloneable
[System.Xml.XmlDocument]
is a 参考类型(相对于值类型例如[int]
), 意思就是:
$object2 = $object1
简单地使$object2
引用(指向)与以下完全相同的对象$object1
.
您可以按如下方式验证这一点:
[object]::ReferenceEquals($object1, $object2)
一般来说:
-
=
with a 值类型实例创建一个的副本实际价值,即它隐式克隆。
-
=
with a 参考类型实例创建一个的副本参考到实例,即,它创建对同一对象的另一个引用。
-
The 同样适用于当你添加元素到(可变的)收藏;例如(假设已经创建了一个列表$list = [System.Collections.Generic.List[object]] @()
):
-
$var = 42; $list.Add($var)
adds a copy of the 值类型 ([int]
) 实例添加到列表中。
-
$var = [pscustomobject] @{ foo = 'bar' }; $list.Add($var)
adds a 参考 to the 参考类型 ([pscustomobject]
) 实例添加到列表中。
To 确定给定类型是值类型还是引用类型,使用类型的布尔值.IsValueType财产:
# Inspect a type directly.
PS> [System.Xml.XmlDocument].IsValueType
False # -> a *reference* type
# Inspect a type via an instance thereof:
PS> $xml = [xml] '<xml/>'; $xml.GetType().IsValueType
False
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)