如果我在main中调用默认构造函数“Creature”然后尝试调用方法“Generate Creator”,则循环永远不会运行。如果我执行了正常的for循环,即使知道默认构造函数设置数组的长度,它也会抛出边界错误。这可能是我没有看到的一个愚蠢的错误。 (这不是所有的代码)
class Creature
{
static int geneLength;
byte[] Chromosome = new byte[geneLength];
int fitness;
string geneString;
Random rn = new Random();
public Creature()
{
geneLength = 36;
fitness = 0;
}
public void GenerateCreature()
{
foreach(byte g in Chromosome)
{
Chromosome[g] = (byte)rn.Next(0, 2);
geneString += Chromosome[g].ToString();
}
}
}
主:
namespace Creature_Generator
{
class Program
{
static void Main(string[] args)
{
Creature c = new Creature();
c.GenerateCreature();
Console.WriteLine(c.getGeneString);
}
}
}
答案 0 :(得分:3)
foreach(byte g in Chromosome)
{
Chromosome[g] = (byte)rn.Next(0, 2); // 'g' is not an index
geneString += Chromosome[g].ToString(); // 'g' is not an index
}
当您使用foreach (byte g in Chromosome)
时,我认为使用像Chromosome[g]
这样的代码不是一种正确的方法,而g是假设value
而不是index
试
StringBuilder geneString = new StringBuilder();
public Creature()
{
geneLength = 36;
this.Chromosome = new byte[geneLength];
fitness = 0;
}
for (int i = 0; i < this.Chromosome.Length; i++)
{
byte g = this.Chromosome[i]; // this line is useless
this.Chromosome[i] = (byte)rn.Next(0, 2);
geneString.Append(this.Chromosome[i].ToString());
}
另外,如果您在构造函数中对geneLength = 36进行硬编码,请考虑使用public int geneString { get; private set;}
代替static int geneLength;
或
static int _geneLength = 36;
public int geneLength { get; private set; }
public Creature() { this.geneLength = _geneLength; }
public Creature(int geneLength) { this.geneLength = geneLength; }
根据@moreON的建议,string geneString
已从班级string
修改为StringBuilder
,详情请见https://msdn.microsoft.com/en-us/library/system.text.stringbuilder(v=vs.110).aspx
答案 1 :(得分:3)
除了您尝试使用foreach的结果索引数组的问题之外,正如其他人所提到的那样,您也忽略了执行初始化程序和构造函数的顺序。
如果我们忽略继承(因为你没有这里有趣的)。初始化器在构造函数之前运行。
这意味着在将36分配给geneLength之前,您正在创建数组染色体。这意味着geneLength仍然是默认值(int),即0,因此您创建了一个长度为0的数组。
有关c#构造函数的更多信息,请参阅Jon Skeet的优秀页面:http://jonskeet.uk/csharp/constructors.html
geneLength可能也不应该是静态的,但这是一个不同的讨论。
答案 2 :(得分:0)
如果您希望geneLength
成为static
字段,则需要使用static
构造函数对其进行初始化。否则,在您实例化该类时,geneLength
的值仍为0
。
改为编写代码:
class Creature
{
static int geneLength;
byte[] Chromosome = new byte[geneLength];
int fitness;
string geneString;
Random rn = new Random();
static Creature()
{
geneLength = 36;
}
public Creature()
{
fitness = 0;
}
public void GenerateCreature()
{
foreach (byte g in Chromosome)
{
Chromosome[g] = (byte)rn.Next(0, 2);
geneString += Chromosome[g].ToString();
}
}
}