当它的方法被调用到 运行 时循环不 运行ning

Loop not running when its method to run it is called

如果我在 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);

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

编辑 1 -

根据@moreON 的建议,string geneString 由 class string 修改为 StringBuilder,阅读更多关于 https://msdn.microsoft.com/en-us/library/system.text.stringbuilder(v=vs.110).aspx

除了您尝试使用 foreach 的结果来索引数组的问题,正如其他人提到的,您还忽略了初始化程序和构造函数的执行顺序。

如果我们忽略继承(因为这里有 none 很有趣)。初始化器 运行 在构造器之前。

这意味着您在将 36 分配给 geneLength 之前创建数组 Chromosome。这意味着 geneLength 仍然是 default(int),即 0,因此您创建了一个长度为 0 的数组。

有关 C# 构造函数的更多信息,请参阅 Jon Skeet 的精彩页面:http://jonskeet.uk/csharp/constructors.html

geneLength 可能也不应该是静态的,但那是一个不同的讨论。

如果您希望 geneLength 成为一个 static 字段,那么您需要使用 static 构造函数对其进行初始化。否则在实例化 class 时 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();
        }
    }
}