如何知道一个变量对另一个对象是否只是一个"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”标识符:
- 引用类型:
class
(例如ArrayList
)
- 值类型:
struct
(例如,DateTime
)
enum
(例如,PlatformID
)
$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”标识符:
- 引用类型:
class
(例如ArrayList
)
- 值类型:
struct
(例如,DateTime
)enum
(例如,PlatformID
)