【发布时间】:2015-02-08 19:45:16
【问题描述】:
我是一名初级程序员,需要一些帮助。在我的程序开始时,创建了 5 个兔子(对象类型 Bunny)。它看起来像这样:
List<Bunny> bunnies = new List<Bunny>();
Bunny newBunny;
for(int i = 0; i < 5; i++)
{
newBunny = new Bunny();
bunnies.Add(newBunny);
}
我的问题是 newBunny 的构建耗时太长,程序继续使用 for 循环。这会导致列表只有第一个构造的 newBunny 和它的副本。运行代码会打印出以下内容:
姓名 - 凯特,性别 - 男,颜色 - 白色,年龄 - 0,放射性 - 假
姓名 - 凯特,性别 - 男,颜色 - 白色,年龄 - 0,放射性 - 假
姓名 - 凯特,性别 - 男,颜色 - 白色,年龄 - 0,放射性 - 假
姓名 - 凯特,性别 - 男,颜色 - 白色,年龄 - 0,放射性 - 假
姓名 - 凯特,性别 - 男,颜色 - 白色,年龄 - 0,放射性 - 假
结构如下:
public Bunny()
{
Random randNum = new Random ();
int namesCount = Enum.GetNames(typeof(BunnyName)).Length;
Name=((BunnyName)(randNum. Next(0, namesCount)));
int genderCount = Enum.GetNames(typeof(BunnyGender)).Length;
Gender=((BunnyGender)(randNum. Next(0, genderCount)));
int colorCount = Enum.GetNames(typeof(BunnyColor)).Length;
Color=((BunnyColor)(randNum. Next(0, colorCount)));
Age=-1;
if(randNum. Next(1,101)<2)
Radioactive = true;
else
Radioactive =false;
}
我希望程序停止直到 newBunny 的构建结束,然后才将其添加到列表中:
List<Bunny> bunnies = new List<Bunny>();
Bunny newBunny;
for(int i = 0; i < 5; i++)
{
//stop until next line finishes
newBunny = new Bunny();
//continue
bunnies.Add(newBunny);
}
附言。如果我正在调试程序,它运行得很好,就像我想要的一样(新兔子不是“重复”) 此外,如果我在 for 循环的末尾添加一个 messageBox,一切正常。 这就是为什么我认为它可能需要暂停
for(int i = 0; i < 5; i++)
{
//stop until next line finishes
newBunny = new Bunny();
//continue
bunnies.Add(newBunny);
MessageBox.Show("test");
}
希望您能理解我的问题,谢谢。
【问题讨论】:
-
“我的问题是 newBunny 的构建耗时太长,程序继续 for 循环。这导致列表中只有第一个构建的 newBunny 和它的副本。”不,那不是真的。目前尚不清楚您为什么认为会发生这种情况,但事实并非如此。请提供一个简短但完整的程序来演示该问题,我们可以帮助您诊断它。另请注意,通过在循环而不是外部声明变量inside,您的代码会更好(IMO) - 通常,对局部变量使用尽可能小的范围。
-
你怎么确定它是同一个对象?
-
如果使用在构造函数内部启动的非阻塞线程(用于初始化对象的属性),可能会导致此行为,但鉴于您是新程序员,您不太可能这样做这个。
-
你所有的
Randoms 都有相同的种子。 -
这样做:静态随机 randNum = new Random ();您的程序实际上非常快。 Random 使用相同的基于时间的种子,并始终生成相同的数字,通过将其设为静态,只会创建一个 Random 实例并一直重复使用,从而生成新的随机数,而不是始终生成相同的随机数。
标签: c#