【问题标题】:Beginner question OOP: What is wrong with this increment on object array初学者问题OOP:对象数组的这个增量有什么问题
【发布时间】: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# 类型都是引用,但它很常见。

标签: c# oop


【解决方案1】:

您正在为数组中的所有位置分配相同的对象引用。所以你正在做的 Page += 10 总是在同一个对象上完成。

这就是为什么您会看到 800、810、820 等。

【讨论】:

    【解决方案2】:

    对于那本书是引用类型,并且所引用的书籍 [i] 与书籍 2 的值存储在堆上是相同的,例如书籍 [i]--> 对象(在堆上)和书籍--> 对象(在堆上)的值是同样。这就是为什么值分别输出为 800,810,820,830,840

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2018-06-14
      相关资源
      最近更新 更多