c# - 正确使用共享静态 'Random' 单例实例?

标签 c# design-patterns static singleton

问题背景:

我目前的代码中有几个“随机”数字实例 - 在两个类中使用 - 我需要将随机生成的数字附加到我正在创建的一些文件夹的名称中。一旦工作(在本例中将文件映射到这些新文件夹)完成,它们就会立即被删除。

代码:

我在每个提到的类中都有以下代码的两个私有(private)静态实例:

private static randomNo = new Random((int)DateTime.Now.Ticks);

单例?或者两个静态实例?:

到目前为止,我还没有遇到任何重复问题。我仍然觉得我应该开发一个单例来在整个解决方案中共享单个静态随机数对象实例。

我正在使用 IoC (Unity) 创建所有类,但不确定应该如何处理共享静态 Random 实例?我可以在每个需要它的类中“新建”单例类吗?或者这会导致静态随机实例重置?我是否需要创建一个单例类并将其在需要随机生成数字的类之间传递?

我应该提到,我确实进行了检查,以确保在创建新文件夹名称并附加随机数时,我确保该名称尚不存在。

最佳答案

您并不严格需要使用 Random整个应用程序中的单例。大多数时候(包括在这种情况下)使用多个实例是一种更喜欢方便而不是“理论上的正确性”的标志,但也存在一些合理的情况,即不同的程序组件在设计上使用不同的 RNG,以便每个组件的行为优于程序的生命周期是确定性的。

如果您想移动到单例实例,您应该使用 RegisterType 指示容器它应该满足 Random 的所有请求具有相同实例的对象:

container.RegisterType<Random>(new ContainerControlledLifetimeManager());

这不会创建 Random现场实例;相反,它会指示容器一旦请求 Random已解决,后续请求将使用同一实例解决。

之后,只需用container.Resolve<Random>()解析单例实例即可。或者使依赖项对容器可见,以便当您指示容器解析 RNG 的用户之一时,它会自动解析并注入(inject) RNG 实例。

关于c# - 正确使用共享静态 'Random' 单例实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23626786/

相关文章:

asp.net-mvc - ASP.NET MVC 中的服务定位器替代方案

c# - 一次性对象 : yea or nay?

java - Java `static {}` 关键字本身是什么?

java - 在 Java 中访问静态字段的正确方法是什么?

c# - 使用可选的减号解析 TimeSpan

c# - 如何在 try catch 语句中重新请求输入

asp.net - 从 Global.Asax Application_Startup 调用 ThreadPool.QueueUserWorkItem

java - 静态方法的使用

c# - MVVM 将选定项从一个用户控件绑定(bind)到另一个

c# - 在 C# 中使用 App Config 文件中的值