C# 调用其运行方法时循环未运行

C# 调用其运行方法时循环未运行,c#,class,loops,console-application,C#,Class,Loops,Console Application,如果我在main中调用默认构造函数“Creator”,然后尝试调用方法“Generate Creator”,则循环永远不会运行。如果我执行普通for循环,即使知道默认构造函数设置数组的长度,它也会抛出越界错误。这可能是一个愚蠢的错误,我没有看到。(这不是全部代码) 主要内容: 当您使用foreach(染色体中的字节g)时,我认为使用染色体[g]这样的代码是不合适的,因为g假设是值而不是索引 试一试 编辑1- 根据@moreON建议,string geneString已从classstring修改

如果我在main中调用默认构造函数“Creator”,然后尝试调用方法“Generate Creator”,则循环永远不会运行。如果我执行普通for循环,即使知道默认构造函数设置数组的长度,它也会抛出越界错误。这可能是一个愚蠢的错误,我没有看到。(这不是全部代码)

主要内容:

当您使用
foreach(染色体中的字节g)
时,我认为使用
染色体[g]
这样的代码是不合适的,因为g假设是
而不是
索引

试一试

编辑1- 根据@moreON建议,
string geneString
已从class
string
修改为
StringBuilder
,请阅读

当您使用
foreach(染色体中的字节g)
时,我认为使用
染色体[g]
这样的代码是不合适的,因为g假设是
而不是
索引

试一试

编辑1-
根据@moreON的建议,
string geneString
已从class
string
修改为
StringBuilder
,请阅读有关的更多信息,而不是您试图使用foreach的结果索引数组的问题,如其他人所述,您还忽略了初始化器和构造函数的执行顺序

如果我们忽略继承(因为这里没有有趣的东西)。初始值设定项在构造函数之前运行

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

有关c#构造函数的更多信息,请参见Jon Skeet的精彩页面:


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

除了您试图使用foreach的结果对数组进行索引的问题之外,正如其他人所提到的,您还忽略了初始化器和构造函数的执行顺序

如果我们忽略继承(因为这里没有有趣的东西)。初始值设定项在构造函数之前运行

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

有关c#构造函数的更多信息,请参见Jon Skeet的精彩页面:


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

如果希望
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();
        }
    }
}

如果希望
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();
        }
    }
}

试着让生物类公开试着让生物类公开你可能不需要
字节g=this.chromose[i]
more=]正常情况下,当您获得“越界”时,意味着您正在查看数组的索引,该索引不可用,例如查找
chromose[g]
,而
g
可能等于10000,并将您的行转换为
chromose[10000]
foreach(染色体中的字节g)
意味着从染色体中获取每个值并分配给g,因此g可能是10000或20000,而您的染色体只包含36个元素。。。预计它会抛出这样的exceptionOk,因此我的问题是越界错误I,因为我正在执行(int I=0;I@sydluce大多数编程语言中的所有数组都从索引[0]开始),而当您有一个大小为36的数组时,最大值将是Arr[35],所以当你使用@ZayLau时,我是个白痴,当我把Arr.length放进去的时候,我没有想到这一点,因为每次我总是把
Arr.length-1
放进去,这次我就错过了。哈哈,谢谢你的帮助!你可能不需要
byte g=this.chromose[I]
more=]通常,当您获得“越界”时,意味着您正在查看数组的索引,该索引不可用,例如查找
chrome[g]
,而
g
可能等于10000,并将您的行转换为
chrome[10000]
foreach(chrome中的字节g)
意味着从染色体中获取每个值并分配给g,因此g可能是10000或20000,而您的染色体只包含36个元素……预计会抛出这样的异常OK,因此我的问题是越界错误I,因为我正在为(int I=0;I@sydluce)执行
for,大多数编程语言中的所有数组都从索引开始[0],当您有一个大小为36的数组时,它的最大值将是Arr[35],所以当你使用@ZayLau时,我是个白痴,当我把Arr.length放进去的时候,我并没有想到这一点,因为每次我总是把
Arr.length-1
放进去,而这次我就错过了。哈哈,谢谢你的帮助!我试着为每个人做了,因为我在for循环中不断出现越界错误,而我的问题是我没有对(int i=0;我尝试对每个进行
for,因为for循环中不断出现越界错误,我的问题是我对(int i=0;i)进行
for
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
}
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());
}
static int _geneLength = 36;
public int geneLength { get; private set; }

public Creature() { this.geneLength = _geneLength; }
public Creature(int geneLength) { this.geneLength = geneLength; }
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();
        }
    }
}