当它的方法被调用到 运行 时循环不 运行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();
}
}
}
如果我在 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();
}
}
}