【发布时间】:2020-08-25 20:12:28
【问题描述】:
刚开始学习 C# 并努力理解正在发生的事情。这是我的问题的简化版本。
我有两个班级,分别是 Dog 和 Kennel。 Kennel 包含一个 Dog 类型的 2D 数组。 Dog 有多个属性(品种、颜色),但对于这个示例,我们只需要 _name。
我想更改一只狗的名字。我试过了:
kennel.Dogs[4,4].Name = "Fido"
但是它将所有的狗都设置为“Fido”的名字。不仅仅是 (4, 4) 处的狗。为什么?
例子:
using System;
public class Program
{
public static void Main()
{
Console.WriteLine("Hello World");
Kennel kennel = new Kennel();
kennel.Dogs[4,4].Name = "Fido";
Console.WriteLine(kennel.Dogs[4,4].Name); //Expectation: Fido; Result: Fido
Console.WriteLine(kennel.Dogs[2,2].Name); //Expectation: Bowser; Result: Fido
}
}
class Kennel {
public Kennel() {
this._dogs = new Dog[10,10];
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++) {
_dogs[i, j] = defaultDog;
defaultDog.Name = "Bowser";
}
}
}
private string _name;
private Dog defaultDog = new Dog();
private Dog[,] _dogs;
public string Name
{
get { return _name; }
set { _name = value; }
}
public Dog[,] Dogs
{
get { return _dogs; }
set { _dogs = value; }
}
}
class Dog {
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
【问题讨论】:
-
您应该尝试提取一个minimal reproducible example,而不是包含整个代码,每个人都可以自己编译和尝试。有时,您甚至可以在创建上述示例时确定错误的原因
-
这是一个统一的游戏,实际代码很难复现。我认为这只会使那些可能能够提供帮助的人感到困惑。此外,如果我是正确的……这不是错误,而是 C# 语言的预期功能。我只是觉得我做错了。
-
我们可以看看 Dog.Name 属性的定义,以及它涉及的任何字段吗?
-
另外,我们能看到你填充数组的代码吗?您是否有可能创建了一个对象并将对同一对象的引用放在数组的多个单元格中?
-
@ragnvaldr.js 您不需要为您的应用程序提供整个代码,您需要提供仍然重现问题的 smallest sn-p 。因此,仅提取您正在操作此数组的代码,确保 sn-p 在运行时自行导致问题,然后提供 that。
标签: c# arrays multidimensional-array