2011-11-02 51 views
0

在我的代碼,我有以下兩個集合:我意外地綁定了兩個可觀察的集合嗎?

private ObservableCollection<Job> listOfJobs1 = new ObservableCollection<Job>(); 
    private ObservableCollection<Job> listOfJobs2 = new ObservableCollection<Job>(); 

昨天我試圖填充listOfJobs2從listOfJobs1的對象,我做到了像...

listOfJobs2 = listOfJobs1;

我注意到,雖然我對listOfJobs1所做的任何修改然後反映在listOfJobs2,甚至代碼很好的路線。

這是'='等同於以某種方式綁定集合,以便他們彼此觀察?

唯一原因,我問的是,因爲這個問題是通過使用在listOfJobs1一個foreach和編程方式使用添加增加listOfJobs2()來解決。如果我是對的,填充集合的兩種方式是不同的,有人能指出我正確的方向來解釋這種工作方式的文章,因爲我現在要編寫一種方法,這將非常依賴於這是這樣的。另外,如果我使用列表<>,情況會是這樣嗎?

+0

它看起來像=運營商正在做一個淺拷貝(見http://weblogs.asp.net/varad/archive/2004/09/13/229182.aspx)也檢查了這一點,因爲它可能會回答你第二個問題,解決方案。 http://stackoverflow.com/questions/2314496/c-sharp-list-member-needs-deep-copy –

+0

你所做的只是改變一個參考,這對於幾乎任何編程語言都很重要,你需要意識到存在一個區分參考名稱和創建新實例,在您的示例中,您簡單地將兩個引用都更改爲指向同一實例,原始第二個列表從未隨後更新,並且很可能已收集垃圾 – meandmycode

+0

另請參閱:http:/ /msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx –

回答

5

listOfJobs1和listOfJobs2是到對象兩個引用(即,它們指向對象的存儲位置)。當你寫:

listOfJobs2 = listOfJobs1; 

你說讓存儲在listOfJobs2參考等於存儲在listOfJobs1參考。換句話說,兩個引用都將指向由listOfObjects1最初引用的對象。此時,您可以用listOfJobs1替換所有listOfJobs2,並且應用程序的行爲將完全相同。

可觀察的集合都包含它們包含的事物的引用列表,所以通過在循環中使用Add()將所有引用從第一個列表添加到第二個列表中,您會說「嗨,列表 - 保留一條記錄這些東西對我來說「,而將列表1分配給列表2,就像你在做的那樣,說」嗨,列表2的引用現在包含列表1「,因此你只有列表1中存儲的列表對象列表。您完全失去了對第二個列表對象的引用,並且您不再有權訪問它。

+0

非常感謝你解釋簡單的配對,我現在把握它,我認爲這是我真正應該知道的對老實說。我會盡快將其標記爲已接受。 –