当我在类中调用方法时,它会覆盖该调用实例中的数据

时间:2011-08-12 15:17:07

标签: c# class

首先我从来没有发过任何这样的问题,所以原谅我做的任何失礼,我也是编程的新手,所以我可能错误地使用了一些术语。

我有一个名为myBit的类,它有一个变量(一个名为bits的布尔数组)和一堆方法。一种这样的方法是:

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)获取imyBit布尔值的位置, 并且setBit(value, i)i中的myBit布尔值设置为值。

调用此方法时出现问题:

bits1.OR(bits2);会返回正确的值,但也会将bit1的所有布尔值设置为bits1.OR(bits2)的布尔值。为什么呢?

2 个答案:

答案 0 :(得分:2)

正确,这就是你的代码正在做的事情。 bits是一个数组;因此,当您创建myBit的新实例时,您将传递数组的引用,而不是数组的副本到新实例。更改新实例只会改变对该数组的共享引用。

您需要制作该数组的副本以发送到新实例,以确保它们包含单独的数据。这称为深层复制。

答案 1 :(得分:0)

我假设myBit的构造函数看起来像这样:

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

这就是原因;数组不是值。如果您传递一个数组,那么使用该特定数组的任何地方都可以更改它并查看在其他地方所做的更改。听起来你需要复制数组。如果您使用的是.NET 3.5或更高版本,LINQ是最简单的方法;

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