【问题标题】:Assigning objects to an array C#将对象分配给数组 C#
【发布时间】:2017-12-10 11:45:58
【问题描述】:

努力将对象分配给 C# 中的数组。

代码的输出是出乎意料的,因为我得到的是 nameOfProject.ClassName(?) x3 而不是我使用 for 循环添加的 3 个怪物的名称和生命值。 调试表明没有分配怪物。有没有像我这样的人应该注意的逻辑缺陷?

class Monsters
{
    public Monsters(string name, int points)
    {
        var monsterName = name;
        var monsterLifePoints = points;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Monsters[] monster = new Monsters[3];

        for (int i = 0; i < monster.Length; i++)
        {
            Console.WriteLine("Please enter a name");
            string name = Console.ReadLine();
            Console.WriteLine("Please enter life points");
            int points = Convert.ToInt32(Console.ReadLine());
            monster[i] = new Monsters(name,points);
            Console.Clear();
        }
        foreach (var element in monster)
        {
            Console.WriteLine(element);
        }
        Console.ReadKey();

    }

【问题讨论】:

  • 你的类名不应该是复数。
  • 分配工作得很好。您从不存储名称,但点
  • 你从来没有告诉它如何打印Monsters,所以这就是你得到的。
  • 这里有多个问题。首先,您没有将名称和点的值存储在类的属性或私有变量中。其次,您没有任何关于怪物类对象如何表示为字符串的逻辑。

标签: c# arrays oop


【解决方案1】:

分配工作得很好。问题是你永远不会指定怪物的名字并指向一个字段或属性:

class Monsters
{
    public Monsters(string name, int points)
    {
        var monsterName = name;
        var monsterLifePoints = points;
    }
}

此代码只是将输入分配给本地值,然后丢弃它们。

你的班级应该是这样的:

class Monsters
{
    public string Name {get;set;}
    public int Points {get;set;}
    public Monsters(string name, int points)
    {
        Name = name;
        Points = points;
    }
}

此行仍然不会打印详细信息:

Console.WriteLine(element);

您需要从属性中创建一个字符串:

Console.WriteLine($"{element.Name} {element.Points}");

或者重写你的类的ToString() 方法:

 public override string ToString()
{
    return $"{element.Name} {element.Points}";
}

【讨论】:

  • 非常感谢您的帮助。你的回答让我思考了很多。 get 是否允许我检索存储在变量中的数据并 set 允许我为变量分配值。总是这样做是否被认为是一种好习惯
【解决方案2】:

WriteLine 应该如何知道您要打印这两个属性而不是例如类型名称(默认情况下)或任何其他奇怪的字符串?你必须告诉你的程序如何做到这一点。这是通过覆盖 ToString

来完成的
class Monster
{
    public override string ToString() {
        return this.name + " " + this.lifePoints;
    }
}

此外,您的变量需要是字段:

class Monster
{
    private readonly string name;
    private readonly int lifePoints;

    Monster(string name, int points)
    {
        this.name = name;
        this.lifePoints = points;
    }
}

【讨论】:

  • 这些是字段,而不是实例变量。没有“实例变量”之类的东西。不过最好使用属性。
  • @PanagiotisKanavos 你说得对,更新了。我不清楚为什么要使用属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多