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