0

是否可以在 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这种情况下,是任务的实例化。SingletonClass是由 使用的数据存储库,NonSingletonClass但可以从外部修改NonSingletonClassSingletonClass存在以确保即使有多个NonSingletonClass实例,所有实例仍然只有一组指令和数据。

4

4 回答 4

4

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

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

你有具体的担忧吗?

于 2009-12-23T17:57:16.723 回答
2

我相信您正在寻找单态模式

此链接对此进行了很好的描述,并提供了与单例模式 单态模式的对比

于 2009-12-23T17:55:13.467 回答
0

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

于 2009-12-23T18:00:46.887 回答
0

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

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

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

于 2009-12-23T22:29:28.150 回答