我有一个 Vector 类,并且我正在测试以下单元测试(使用 nUnit)。
1 Vector test1 = new Vector(new double[] { 6, 3, 4, 5 });
2 Vector test2 = test1;
3 Assert.AreEqual(test1, test2, "Reference test");
4 test2 = new Vector(new double[] { 3, 3, 4, 5 });
5 Assert.AreEqual(test1, test2, "Reference test");
第 3 行中的第一个测试通过,但第 5 行中的第二个测试失败。既然我在第 2 行中执行了赋值语句,那么 test2 不应该也指向与 test1 相同的内存吗?我的Vector被定义为一个类,因此它是一个引用类型。另一方面,以下测试通过了:
1 Vector test1 = new Vector(new double[] { 6, 3, 4, 5 });
2 Vector test2 = test1;
3 Assert.AreEqual(test1, test2, "Reference test");
4 test2[1] = 4;
5 Assert.AreEqual(test1, test2, "Reference test");
这是否意味着,当我使用 new 运算符定义新对象时,旧的赋值不再有效?还有其他(或正确的 - 如果我错了)解释吗?
最佳答案
线路
test2 = new Vector(new double[] { 3, 3, 4, 5 });
在堆上创建一个新的Vector
实例,并将其地址分配给test2
变量。之后 test2
将指向一个新的、完全不同的对象。
相比之下,这条线
test2[1] = 4;
不会更改test2
变量本身(它是对堆上某个对象的引用)。相反,它正在改变它指向的对象。 test2
仍然引用堆上的同一位置。
总而言之,在前者中,您正在更改引用,而在后者中,您正在更改引用。
关于c# - 引用问题: when are two objects equal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2018458/