2011-08-12 25 views
0

まず最初に私はこのような質問を投稿したことがありませんので、私が作る偽物を許しません。誤って一部の用語を使用することがあります。クラス内のメソッドを呼び出すと、その呼び出しのインスタンスのデータが上書きされます

私は、1つの変数(ビットと呼ばれるブール値の配列)とメソッドの束を持つmyBitというクラスを持っています。このような方法の一つは、次のとおりです。getBit(i)myBit、 とsetBit(value, i)ブール番目iを取得

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; 
}  

が値にmyBitにブール番目iを設定します。

私は、このメソッドを呼び出したときに私の問題が発生します。

bits1.OR(bits2);は、正しい値を返すだけでなく、bits1.OR(bits2)のものにbit1のブール値のすべてを設定します。どうして?

+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

@A Spoty Spot:問題ありません。サイトへようこそ!私の(または他の)回答があなたの問題を解決した場合は、チェックマークをクリックして、それを合格とマークしてください。これにより、同様の問題を抱えている他の人が、より簡単に解決策を見つけられる –

2

正しいことが、あなたのコードが行っていることです。 bitsは配列です。したがって、新しいインスタンスmyBitを作成しているときは、新しいインスタンスに配列のコピーではなく、配列の参照を渡しています。新しいインスタンスを変更するだけで、その配列への共有参照が変更されます。

新しいインスタンスに別のデータが含まれていることを確認するためにその配列のコピーを作成する必要があります。これはディープコピーと呼ばれます。

+0

感謝を見てアレイ –

関連する問題