随机对象引用

本文关键字:对象引用 随机 | 更新日期: 2023-09-27 18:07:43

是的,我搜索了这种情况,但无法将其他情况与此联系起来…(请不要打我…)

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)];": 对象引用未设置为对象的实例。我能做些什么来解决这个问题?

随机对象引用

可以初始化变量。目前,您从未将其设置为值。声明在这里:

public Random Randomizer;

…但你从来没有给它一个值,所以它将有默认值null,这将导致一个异常抛出当你解引用它。值得理解的是,这与无关,因为它是关于随机性的……同样的情况也会发生在任何引用类型变量上,例如stringStream

可以直接使用:

private readonly Random randomizer = new Random();

…但这样做还有其他缺点。(请注意,我将其设置为私有和只读的—您应该避免几乎所有的公共字段,并将其设置为只读的,除非您真的希望该值在对象的生命周期中变化。)

就缺点而言,有两个值得担心:

  • 如果在很短的时间内使用无参数构造函数创建Random的多个实例,其中许多实例可能共享相同的种子,这意味着它们将产生相同的随机数。
  • Random不是线程安全的——如果你在没有任何锁定的情况下使用多个线程中的单个实例,你很容易进入每次只返回0的状态。

这两个人在一起特别讨厌…如果不是出于线程安全方面的考虑,只声明一个静态字段并为所有内容使用相同的实例将是相当合理的。但如果涉及多个线程,这就行不通了。同样,如果共享种子不是问题,那么在每次需要时创建一个就可以了。

我在。net中有一个关于随机性的页面,它详细介绍了这个问题,并提出了一些解决方法

public Random Randomizer = new Random();