【发布时间】:2014-05-08 23:56:35
【问题描述】:
我正在寻找答案,但找不到任何东西,所以:
我正在做一个简单的项目,但我有一个问题:
// fragment of code in parent form
Random r = new Random();
private void BeginGame()
{
SetName();
sheep = new Sheep[howManySheep];
for (int i = 0; i < howManySheep; i++)
sheep[i] = new Sheep(this);
(...)
}
public Sheep DrawSheep
{
set
{
splitContainer1.Panel2.Controls.Add(value);
}
}
// fragment of code in child form
class Sheep : Button
public Sheep(Form1 _parent)
: base()
{
var p = new Point(r.Next(_parent.PanelSize[0]), r.Next(_parent.PanelSize[1]));
Text = null;
Size = new Size(size, size);
BackColor = Color.White;
Tag = nrSheep++;
Location = p;
_parent.DrawSheep = this;
MessageBox.Show(this.Location.ToString());
}
虽然 MessageBox.Show(..) 被评论,但它只画了一只羊(我的意思是所有羊,但在同一个地方) 当 MessageBox.Show(..) 未注释时,它绘制的一切都很好,它应该是怎样的。 我的问题是怎么做?
【问题讨论】:
-
使用调试器,卢克!
-
听起来是 Random 的问题。当你改为
public static Random r时它会消失吗? -
是的,你是对的,谢谢。使字段随机静态解决了我的问题。但是我仍然不知道为什么显示消息会干扰这个过程
-
当您连续快速创建新实例而不是保留 Random 的单个静态实例时,最常出现问题。这可能发生得如此之快,以至于它们获得相同的默认种子,从当前时间派生,因此将创建相同的数字序列。 MessageBox 让很多时间过去了,所以问题似乎解决了,但实际上只是隐藏了..通常只需要一个 Random 生成器,这需要将其设为静态。另一种隐藏它的方法是使用调试器;-)
-
@TaW 将您的评论变成答案——它应该被接受。
标签: c# winforms button splitcontainer