我知道在C#中的类的构造函数中调用方法不是一个好习惯,但我坚持了一些奇怪的想法。我的问题是,当我创建类的对象时,我需要为对象中的字段分配一个随机数。

例如

class RandomNumberHandler
    {
        private int randomNumber;
        public RandomNumberHandler()
        {
            this.randomNumber = GenerateRandomNumber();
        }

        private int GenerateRandomNumber()
        {
            return (new Random()).Next(3000) + 1000;
        }
    }


就我而言,我需要一个四位数的数字。我想在要创建对象的类中生成随机数,并将其作为参数传递给构造函数,但在其他类中生成随机数似乎也不是一个好主意,因为我正试图实现强大的凝聚力我的课。我正在为我大学的“高质量代码”课程而做,我正在寻找最好的方法。任何想法如何做到这一点,欢迎:)

最佳答案

首先,在构造函数中调用非虚拟方法没有错。你在哪里看的? (注意:调用虚拟方法可能是一个问题;这不是自动禁止,但您需要非常仔细地观察正在做的事情)。

顺便说一句,每次调用Random都生成一个新的GenerateRandomNumber实例似乎很浪费。您可以将Random实例提取到字段中以解决此问题:

class RandomNumberHandler
{
    private readonly Random random = new Random();
    private int randomNumber;

    public RandomNumberHandler()
    {
        this.randomNumber = GenerateRandomNumber();
    }

    private int GenerateRandomNumber()
    {
        return this.random.Next(3000) + 1000;
    }
}


但这又引发了一个问题:如果GenerateRandomNumber在每个实例的生命周期中(在构造函数中)仅被调用一次,则为每个对象创建一个新的Random毫无意义。因此,下一个逻辑步骤是使randomstatic。这意味着GenerateRandomNumber也可以成为static(实际上,它必须):

class RandomNumberHandler
{
    private static readonly Random Random = new Random();
    private int randomNumber;

    public RandomNumberHandler()
    {
        this.randomNumber = GenerateRandomNumber();
    }

    private static int GenerateRandomNumber()
    {
        return Random.Next(3000) + 1000;
    }
}

关于c# - 如何在C#中的类的构造函数中生成随机数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5422141/

10-11 22:49
查看更多