$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) Mi pregunta es cuando asigno la instancia a una nueva variable $x , ¿cómo sé cuando llamo a un método en $x que se reflejará en $Package ? Entonces, cuando elimine algo de $x , ¿también eliminará esa cosa de $Package ? Si la respuesta es "depende", ¿cómo puedo saberlo sin configurar un experimento?
tl; dr
Dado que la propiedad $Package.Connections contiene una instancia de un tipo de referencia de .NET, a saber, Microsoft.SqlServer.Dts.Runtime.Connections , $x y $Package.Connections referencia a la misma instancia de colección, por lo que $x.Remove("Something") es lo mismo que $Package.Connections.Remove("Something")
El comportamiento depende de si un valor dado es una instancia de un tipo de referencia o un tipo de valor de .NET:
Cuando las instancias de tipo de referencia se asignan a una (nueva) variable/se pasan como argumento, es la referencia ("puntero") a los datos reales lo que se copia, lo que significa que tanto el valor original como la variable/parámetro de destino se refieren al mismo objeto .
Por el contrario, asignar/pasar una instancia de tipo de valor hace una copia del valor en sí , lo que da como resultado copias independientes de los datos.
Puede examinar un objeto almacenado en una variable dada $x de la siguiente manera: $true indica una instancia de tipo de valor, $false una instancia de tipo de referencia:
$x.GetType().IsValueType Tenga en cuenta que los tipos de colección , incluidas las matrices , son instancias de tipo de referencia , por lo que $x y $Package.Connections en el código de su pregunta se referirán a la misma colección.
Por el contrario, todos los llamados tipos primitivos , como los números, son tipos de valor .
Si no desea depender de la inspección en tiempo de ejecución , puede examinar la documentación de un tipo determinado, que (con el lenguaje configurado en C#) utilizará los siguientes identificadores de "tipo-clase":
class (por ejemplo, ArrayList )struct (por ejemplo, DateTime )enum (por ejemplo, PlatformID )