【问题标题】:C# Object Array Changing all element properties [closed]C#对象数组更改所有元素属性[关闭]
【发布时间】: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


【解决方案1】:

我可以在三种情况下导致这种症状:

  1. 您实际上只有一个Dog 对象,并且数组中的每个单元格都是对该单个对象的引用;如果是这样:修复您的数组初始化以创建多个不同的对象;根据问题中的代码,似乎不是这种情况
  2. 您有多个Dog 对象,但包含名称的字段是static 字段;如果是这样:修复字段(删除static
  3. 您有多个Dog 对象,但名称是通过对另一个在它们之间共享的另一个中间对象的单独引用;如果是这样:修复中间引用

【讨论】:

    猜你喜欢
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多