【发布时间】:2022-11-14 08:36:26
【问题描述】:
我刚开始使用 OOP 并试图理解下面的代码。为什么 book2 对象会改变它的值,即使我没有将它定义为其他东西,只是使用该对象来定义书籍数组中对象的值。
Book[] books = new Book[5];
Book book2 = new Book("test", "test1", 800);
for (int i = 0; i < books.Length; i++)
{
books[i] = book2;
Console.WriteLine(books[i].pages);
books[i].pages += 10;
}
关于对象,我是否遗漏了一些基本的东西?在我看来,这段代码应该返回 800,5 次。
公正和解释我的想法是如何有缺陷的
【问题讨论】:
-
欢迎来到 SO!这行代码:
books[i] = book2将数组每个元素的指针变为book2的指针。基本上在那之后数组中的每个元素都是'book2'。尝试将其更改为:books[i] = new Book("test", "test1", 500); -
“为什么 book2 对象改变了它的值” - 因为你在这里这样做:
books[i].pages += 10。基本上看起来你需要阅读如何引用类型使用 C# 工作 - 我的(旧但仍然有效)文章是一个合理的起点:jonskeet.uk/csharp/references.html -
您将具有值 test、test1 和 800 的相同
Book对象分配给 for 循环内的所有 Book 数组元素,并且每次都更改页数 - 这意味着所有条目都指向同一个对象,这它的页数最终增加了 5 倍。 -
很多人给出了很好的答案。但只是为了帮助概念化它。假装我们在现实世界中有一本书。只有其中一个,我们将它从一个人传到另一个人,并要求他们在书中写 10 页。每次我们将它传递给下一个人时,他们都会得到同一本书。如果你问所有五个人他们正在写哪本书,他们都会指向同一本书。你可以拿一本新书,给他们自己的。他们可以拿自己的副本并请其他人签名,等等。这就是引用类型的概念。并非所有 c# 类型都是引用,但它很常见。