2011-08-12 44 views
0

首先,我從來沒有發佈過這樣的問題,所以原諒我犯的任何失禮,我也是編程新手,所以我可能會錯誤地使用一些術語。我有一個名爲myBit的類,它有一個變量(這是一個稱爲位的布爾值數組)和一組方法。一種這樣的方法是:當我在一個類中調用某個方法時,它將覆蓋該調用實例中的數據

public myBit OR(myBit b) 
{ 
    myBit a = new myBit(bits); 
    for (int i = 0; i < bits.Length; i++) 
    { 
     a.setBit(a.getBit(i) || b.getBit(i), i); 
    } 
    return a; 
}  

getBit(i)得到在myBit, 和setBit(value, i)i個布爾設置i個布爾在myBit的值。

bits1.OR(bits2);返回正確的值,而且將所有bit1的布爾值到的bits1.OR(bits2)的:

當我把這個方法出現我的問題。爲什麼?

+0

另外,看看http://www.yoda.arachsys.com/csharp/parameters.html – VoodooChild

回答

0

我假設爲myBit構造看起來有點像這樣:

public myBit(myBit bits) 
{ 
    this.bits = bits; 
} 

這就是爲什麼;數組不是值。如果傳遞一個數組,那麼使用該特定數組的任何地方都可以更改它並查看其他地方所做的更改。這聽起來像你需要複製陣列。如果您使用.NET 3.5或更高版本,則LINQ是最簡單的方法;

public myBit(myBit bits) 
{ 
    this.bits = bits.ToArray(); 
} 
+0

而且非常感謝你也救了我很多麻煩複制陣列 –

+0

@ Spoty Spot:沒問題;歡迎來到該網站!如果我的(或任何其他)答案解決了您的問題,請務必通過單擊複選標記將其標記爲已接受。這有助於其他類似問題的人更輕鬆地找到解決方案。 –

2

正確,那就是你的代碼在做什麼。 bits是一個數組;所以當你創建你的新實例myBit時,你傳遞的是數組的引用,而不是數組的副本到你的新實例。改變你的新實例只是改變對該數組的共享引用。

您需要將該數組的副本發送到新實例,以確保它們包含單獨的數據。這被稱爲Deep Copy。

+0

謝謝,我現在跟着 –

相關問題