2016-10-11 45 views
1

比方說,我有這樣2類:插入不同值列出C#

public class BlockBuilding 
{ 
    private List<Room> rooms; 
... 

public class Room 
{ 
    private List<Chair> chairs; 
.... 

然後我聲明一個二維數組變量和分配值:

BlockBuilding[,] bB= new BlockBuilding[2,1]; 

Room room = new Room(); 
BlockBuilding b1 = new BlockBuilding(); 
BlockBuilding b2 = new BlockBuilding(); 

b1.getRooms().Add(room); 
b2.getRooms().Add(room); 

bB[0,0] = b1; 
bB[1,0] = b2; 

Chair c1 = new Chair(); 
Chair c2 = new Chair(); 

bB[0,0].getRooms()[0].getChairs().Add(c1); 
bB[1,0].getRooms()[0].getChairs().Add(c2); 

假設所有必要的數據是存在的,當我試圖在bB [0,0]和bB [1,0]中顯示椅子時,沒有NullException問題,令人驚訝的是它們都包含c1和c2,而每個椅子只應包含一把椅子。

以上所有內容與我的代碼都是類似的代碼結構,由於披露協議的限制,我的代碼不允許泄露。我已經被這個bug困擾了數週。任何幫助將不勝感激!

+2

你有一個房間。爲什麼它不包含兩個椅子呢? –

+5

您將同一個房間添加到兩個建築物中。 – juunas

+0

我認爲房間是通過價值而不是通過參考添加的。我會盡力從這個方向解決問題。 – Jeff

回答

0

你應該使用兩個diferent房,因爲既然是一個參考,你所添加的兩種BlockBuildings同一個房間...

Room room1 = new Room(); 
Room room2 = new Room(); 
BlockBuilding b1 = new BlockBuilding(); 
BlockBuilding b2 = new BlockBuilding(); 

b1.getRooms().Add(room1); 
b2.getRooms().Add(room2); 
+0

而不是讓房間變量創建添加方法的房間。 – deathismyfriend

+0

是的,這是另一種方式,但對於新開發者來說是難以理解的:) – lem2802

+0

@deathismyfriend:通過OP的代碼,我認爲創建'room1'和'room2'變量實際上會更容易,分配椅子給他們,並避免整個'bB [0,0] .getRooms()[0] .getChairs().Add(c1);'看起來非常醜陋的部分。 –

0

class按引用傳遞,這樣你就添加了相同的對象兩個房間。

如果您想「按值複製」功能,您需要使用struct(確保首先閱讀一些「C#值與參考類型」文章,如References and Values)。

或者,您可以在添加到列表之前對對象進行深度複製(Deep cloning objects)。

0

謝謝你們!事實上,我對C#是陌生的,我的項目非常依賴它。有太多有用的答案,我不能評價任何人作爲「最」有用的答案,因爲你們所有人都是最好的!是的,問題是單個房間實例,爲每個BlockBuilding創建獨立的房間實例將立即解決問題。