Sto*_*men 1 c# random methods constructor
我知道在C#中的类的构造函数中调用一个方法不是一个好习惯,但我坚持一些奇怪的东西.我的问题是,当我创建我的类的对象时,我需要在对象中使用随机数分配一个字段.
例如
class RandomNumberHandler
{
private int randomNumber;
public RandomNumberHandler()
{
this.randomNumber = GenerateRandomNumber();
}
private int GenerateRandomNumber()
{
return (new Random()).Next(3000) + 1000;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我需要一个四位数字.我认为在课堂生成随机数,其中我创建的对象,并把它当作参数传递给构造函数,但发生在其他类中的随机数似乎不是一个很好的主意是因为我试图实现了强大的凝聚力对于我的课程.我正在为我在大学的"高质量代码"课程这样做,我正在寻找最好的方法.欢迎任何想法如何做到这一点:)
首先:在构造函数中调用非虚方法没有错.你在哪里读到的?(注意:调用虚拟方法可能是一个问题;它不是一个自动禁止,但你需要非常仔细地观察你正在做的事情).
另外,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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是这引出了另一个问题:如果GenerateRandomNumber
在每个实例的生命周期中(在构造函数中)只调用一次,那么Random
为每个对象创建一个新的没有意义.所以下一个合乎逻辑的步骤就是random
成为static
.这意味着它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;
}
}
Run Code Online (Sandbox Code Playgroud)