$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 https://learn.microsoft.com/en-us/dotnet/api/microsoft.sqlserver.dts.runtime.connections, $x
and $Package.Connections
引用完全相同的集合实例,所以$x.Remove("Something")
是相同的$Package.Connections.Remove("Something")
该行为取决于给定值是否是 .NET 的实例参考类型 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types or 值类型 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/value-types:
您可以检查存储在给定变量中的对象$x
如下:$true
表示一个值类型实例,$false
引用类型实例:
$x.GetType().IsValueType
注意类似收藏的类型,包括arrays, are 参考类型实例,所以$x
and $Package.Connections
在您问题的代码中将引用同一个集合。
相比之下,所有所谓的原始类型,例如数字,是值类型.
如果您不想依赖检查在运行时,你可以检查文档对于给定类型(语言设置为 C#)将使用以下“类型类型”标识符:
- Reference types:
-
class
(e.g. ArrayList https://learn.microsoft.com/en-US/dotnet/api/System.Collections.ArrayList)
- Value types:
-
struct
(e.g., DateTime https://learn.microsoft.com/en-US/dotnet/api/System.DateTime)
-
enum
(e.g., PlatformID https://learn.microsoft.com/en-US/dotnet/api/System.PlatformID)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)