嵌套的Singleton类

时间:2009-12-23 17:51:26

标签: c# singleton nested nested-class

是否可以在C#中将单例类嵌套在非单例类中,如果是这样,在这种情况下是否对单例的生命周期有任何限制?

public class NonSingletonClass
{
  public NonSingletonClass()
  {
    // Initialize some stuff.
  }

  // Put some methods here.

  public class SingletonClass
  {
    // Singleton construction goes here.

    // Put some methods here.
  }
}

在我的应用程序的设计中,这是有道理的,但在实际实现之前,我需要知道任何潜在的问题。

编辑:具体来说,我有一个基于计时器执行任务的作业主机。在这种情况下,NonSingletonClass是任务的实例化。 SingletonClassNonSingletonClass使用的数据存储库,但可以在NonSingletonClass之外进行修改。存在SingletonClass以确保即使有多个NonSingletonClass个实例,仍然只有一组指令和数据适用于所有实例。

4 个答案:

答案 0 :(得分:4)

是的,单身人士可以完全舒服地生活在非单身人士中。

嵌套类的生命周期完全独立于外部类的生命周期。嵌套类和C#中的非嵌套类之间几乎没有什么区别。 (存在一些差异 - 嵌套类可以访问外部类的私有成员,并且扩展方法必须位于非嵌套静态类中,例如 - 但它不会影响的生命周期。

你有特别关注吗?

答案 1 :(得分:2)

我相信你正在寻找一种单一的模式

此链接是对此的良好描述,并提供具有单例模式的合同 monostate pattern

答案 2 :(得分:0)

我想我的第一个问题是你能否给我们更多细节,考虑到你说“我的应用程序的设计是有道理的”。抽象工厂和构建器只是一些使用单例类的模式。您是否存储要在NonSingletonClass中使用的某种全局数据。

答案 3 :(得分:0)

考虑到两个类都没有对另一个类的引用,我认为嵌套单例没有任何问题。考虑到你说单例为多个实例提供可变数据存储,我认为你的潜在问题将与并发相关。

这些仅在允许多线程访问时适用,也就是说,首先我们必须确保适当的锁定到位,以便单例始终处于有效状态。第二,如果单例状态正在改变并且对象以非确定性顺序访问,则结果将不可预测(即竞争条件)。

如果并发性不是应用程序的问题,我发现使用私有嵌套类是隐藏实现细节并确保每个对象只有一个角色的绝佳方法。