如何在c#中重置单例实例?

时间:2011-03-04 19:09:06

标签: c# singleton

当用户更新数据库时,是否有办法强制单例实例重置?

public class Example{
      private Dictionary<int, string> _list;

      private Example(){
        _list = new Dictionary<int, string>();
        //Get data from database here and add the data to _list
      }

      private class Nested{ 
          static Nested(){}
          internal static readonly Example Instance = new Example();
      }

      public static Dictionary<int, string> GetExample(){
         return Nested.Instance._list
      }

}

那么,我是否在更新数据库时重置_list?

谢谢!

2 个答案:

答案 0 :(得分:7)

简短的回答是:否。

最接近的是重置词典:

public void Reset(){ _list.Clear(); }

现在答案很长......

你为什么要使用单身人士?我认为这是因为你阅读了GoF设计模式书并认为它看起来像一个有趣的想法。单例模式打破了面向对象设计的每一个原则。你不能从它们继承,破坏封装,也不存在多态性。

在你发布的例子中,你将你的班级(字典)的内部工作交给任何想要它的人。如果他们改变了怎么办?如何使用线程?

如果你只想在你的应用程序中使用一个类的实例,那么只调用new一次,或者使用具有单例生活方式的依赖注入容器,但这是另一个主题。

呃,我讨厌单身人士。

答案 1 :(得分:0)

一种方法是使用延迟加载并提供“无效”或“重置”方法。

public class Example
{
  private static Dictionary<int, string> _list;

  public static void Invalidate()
  {
       _list = null;
  }

  public static Dictionary<int, string> GetExample()
  {
      if (_list == null)
          _list = new Dictionary<int, string>();

     return _list;
  }
}

有一点需要注意的是,根本没有设置多线程。不建议将Dictionary类用于重入代码,并且需要在GetExample和I​​nvalidate方法中实现某种锁定。