c# - 引用问题: when are two objects equal?

标签 c# .net variable-assignment reference-type

我有一个 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/

相关文章:

c# - 在 C# 中交换字典类型参数的复杂性

c# - Google 财经,如何获取流式传输的 JSON 数据?

c# - 如何从 Pacer.gov API 发出案例请求?

.net - 无法在 Linux 上生成 UE5 项目文件

asp.net - 使用数据列表时如何更改表格布局?

ruby - 为什么 ruby​​ 定义变量,即使它从不执行变量赋值代码?

c# - 使用 Linq 表达式作为具有父/子查询的规范模式

c# - Entity Framework 、存储库模式、工作单元和测试

ruby - 仅在非 nil 时才分配变量

Python 将多个变量初始化为相同的初始值