$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?如果答案是“視情況而定”,如果不進行實驗,我怎么能知道?
uj5u.com熱心網友回復:
tl;博士
因為該$Package.Connections屬性包含一個 .NET參考型別Microsoft.SqlServer.Dts.Runtime.Connections的實體,即$x和$Package.Connections參考同一個集合實體,所以$x.Remove("Something")與$Package.Connections.Remove("Something")
行為取決于給定值是 .NET參考型別還是值型別的實體:
當參考型別實體被分配給(新)變數/作為引數傳遞時,它是對復制的實際資料的參考(“指標”),這意味著原始值和目標變數/引數都參考對同一個物件。
相比之下,分配/傳遞值型別實體會復制值本身,從而產生資料的獨立副本。
您可以檢查存盤在給定變數中的物件$x,如下所示:$true表示值型別實體,$false參考型別實體:
$x.GetType().IsValueType
請注意,類似集合的型別(包括陣列)是參考型別實體,因此$x在$Package.Connections您問題的代碼中將參考同一個集合。
相比之下,所有所謂的原始型別,例如數字,都是值型別。
如果您不想在運行時依賴檢查,您可以檢查給定型別的檔案,該型別(語言設定為 C#)將使用以下“型別型別”識別符號:
- 參考型別:
class(例如ArrayList)
- 值型別:
struct(例如,DateTime)enum(例如,PlatformID)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/443085.html
下一篇:如何理解“內核內部”這句話
