C#:在单例模式中仅初始化Random()一次

时间:2017-02-24 19:14:50

标签: c# random singleton

我试图只对一个随机变量进行初始化,让我们说' rnd'。因此,如果从我的程序的许多点调用它,那么随机变量将不会再次初始化,只是第一次。

所以我创建了一个单例,但我不知道如何只调用一次Random()。

public sealed class Randomize
{
    private static Randomize instance = null;
    private static readonly object padlock = new object();

    Randomize()
    {
    }
    public static Randomize Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new Randomize();
                }
                return instance;
            }
        }
    }
}

在这个课程中,我想创建一个私有的只读随机变量' rnd',它首次初始化为第一次:

Random rnd = new Random()

然后,我想创建一个属性来读取它的值,例如:

        public Random Rnd
        {
            get { return rnd; }
        }

我不想允许更改其值,因为它只是第一次分配,所以我只希望该属性是readonly(get),而不是设置。

因此,从我的计划的许多方面来看,我可以做到:

private readonly Random rnd;
Random rnd = Randomize.Instance.Rnd;

但是每当我使用上面的表达式调用它时,我不想再次启动随机变量(通过执行新的Random()),而是希望始终获得与第一次初始化rnd变量相同的值。

关于如何做的任何想法?

3 个答案:

答案 0 :(得分:2)

只需使用一个静态构造函数,根据定义只能被调用一次

MSDN文件状态:

  

静态构造函数用于初始化任何静态数据,或执行仅需要执行一次的特定操作。在创建第一个实例或引用任何静态成员之前会自动调用它。

public sealed class Randomize
{
    private static Randomize instance = null;
    private static readonly object padlock = new object();

    public Random GetRandom { get { return rnd; } }        

    private static readonly Random rnd;

    static Randomize()
    {
        rnd = new Random();
    }
}

答案 1 :(得分:1)

您可以使用以下代码段访问Randomize.Random,并始终返回曾经初始化的Random rnd字段。

public sealed class Randomize {
    private static readonly Random rnd = new Random();
    public static Random Random {
       get {
           return rnd;
       }
    }
}

答案 2 :(得分:0)

可以在构造函数中分配只读变量,所以我会去那条路。

public sealed class Randomize {
    /* access level here */ Random rnd { get { return r; } }
    private readonly Random r;

    static Randomize() {
        r = new Random();
    }
}

// or

        private readonly Random r = new Random();
        public Random rnd {
            get {
                return r;
            }
        }