如何知道一个变量对另一个对象是否只是一个"pointer"或者它是否可以独立存在

How to know if a variable is only a "pointer" to another object or if it can exist independently

$App = New-Object -TypeName Microsoft.SqlServer.Dts.Runtime.Application; 

$PackageFullPath = 'C:\SSISPackage.dtsx'; 

$Package = $App.LoadPackage($PackageFullPath, $null, 0);

$x = $Package.Connections
$x.Remove("Something")

$App.SaveToXml($PackageFullPath, $Package, $null)

我的问题是,当我将实例分配给一个新变量 $x 时,我如何知道我在 $x 上调用方法时它会反映在 $Package 上?那么当我从 $x 中删除某些内容时,它是否也会从 $Package 中删除该内容?如果答案是“视情况而定”,我如何在不设置实验的情况下知道?

tl;dr

因为 $Package.Connections 属性 包含 .NET 引用类型 的实例,即 Microsoft.SqlServer.Dts.Runtime.Connections$x$Package.Connections 引用完全相同的集合实例,因此 $x.Remove("Something")$Package.Connections.Remove("Something")

相同

行为取决于给定值是否是 .NET 的实例 reference type or value type:

  • reference-type实例被分配给一个(新)变量/作为参数传递时,它是引用(“指针”)指向被复制的实际数据,这意味着原始值和目标变量/参数都引用相同的对象.

  • 相比之下,分配/传递 value-type 实例会复制 值本身 , 导致数据的独立副本

您可以按如下方式检查存储在给定变量 $x 中的对象:$true 表示 value-type 实例,$false 表示 reference-type 实例:

$x.GetType().IsValueType

注意collection-like类型,包括数组,是reference-type 个实例,因此您问题中代码中的 $x$Package.Connections 将引用同一个集合。
相比之下,所有so-called 原始类型,例如数字,都是值类型

如果您不想依赖检查在运行时,您可以检查给定类型的文档,其中(语言设置为 C#)将使用以下“type-kind”标识符: