随机对象引用

时间:2013-04-06 21:52:51

标签: c#

是的,我搜查了这种情况,但无法真正将其他人与此联系起来......(请不​​要抨击我......)

public Random Randomizer; 

string[] Monsters = { "Rat", "Giant Rat", "Skeleton", "Infected" };

public string DisplayKilled() 
{
    if (PlayerOne.Level <= 5) 
    {
        string randomMonster = Monsters[Randomizer.Next(1,2)]; // <= problemo

我遇到错误“string randomMonster = Monsters [Randomizer.Next(1,2)];”  : 未将对象引用设置为对象的实例。 我该怎么做才能解决此问题?

2 个答案:

答案 0 :(得分:6)

您可以初始化变量。目前,您永远不会将其设置为值。这是声明

public Random Randomizer;

...但是你永远不会给它一个值,因此它将具有默认值null,这会在你取消引用它时引发异常。值得理解的是,这与没有关于随机性这一事实有关......与任何引用类型变量相同,例如stringStream

可以使用:

private readonly Random randomizer = new Random();

......但是还有其他缺点。 (请注意,我已将其设为私有和只读 - 您应该几乎无处不在地避开公共字段,并将其设为只读,除非您确实希望值在对象的生命周期内发生变化。)

就缺点而言,有两个需要担心:

  • 如果您在非常短的时间内使用无参数构造函数创建多个Random实例,则其中许多实例可能共享相同的种子,这意味着它们将生成相同的随机数。
  • Random不是线程安全的 - 如果您使用来自多个线程的单个实例而没有任何锁定,您可以轻松进入每次只返回0的状态。

其中两个特别令人讨厌......如果不是线程安全方面,那么只声明一个静态字段并对所有内容使用相同的实例是相当合理的。但如果您涉及多个线程,那么这不起作用。同样,如果共享种子不是问题,那么每次需要时都可以创建一个。

我有一个page on randomness in .NET,详细介绍了这一点,并提出了一些解决方法。

答案 1 :(得分:1)

public Random Randomizer = new Random();