将对象分配给数组C#

时间:2017-07-06 12:50:41

标签: c# arrays oop

努力在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();

    }

2 个答案:

答案 0 :(得分:4)

作业很好。问题是你永远不会将怪物的名字和点指向某个领域或财产:

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}";
}

答案 1 :(得分:0)

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;
    }
}