调用其运行方法时循环不运行

时间:2016-08-25 01:49:27

标签: c# class loops console-application

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

             }
          } 
       }

3 个答案:

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

编辑1 -

根据@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();
        }
    }
}