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