日期:2014-05-17  浏览次数:20932 次

C#静态类的使用
有这样一段代码,一个类A里面使用了一个静态的方法B,这个方法B里面实现对这个类A的实例缓存。

我的问题:为什么不把类做成静态类?这样做有什么好处么?


问题示例:

  public class GameUserCacheInstance
  {
  private static object userObject = new object();
  
  /// <summary>
  /// 游戏用户缓存单例
  /// </summary>
  private static GameUserCacheInstance _instance = null;

  public static GameUserCacheInstance GetInstance()
  {
  if (_instance == null)
  {
  lock (userObject)
  {
  if (_instance == null)
  _instance = new GameUserCacheInstance();
  }
  }

  return _instance;
  }
  …………
  }

------解决方案--------------------
这是一个蹩脚的套用“单例模式”的代码,更糟糕的是,这代码本身就是有问题的(参考CLR via C#中关于Double Check Lock的那一章)。之所以这样,是因为在Java和早期的C#中不支持静态类,所以才使用这么蹩脚的设计。
------解决方案--------------------

------解决方案--------------------
你的这段代码是singleton设计模式的c#实现。
这个设计模式可以保证整个程序里只有一个GameUserCacheInstance类的实例

而你说的把类做成静态类,看上去和singleton差不多,但是有一个重要的区别:
singleton是创建一个类的唯一实例,这个实例可以具有面向对象的所有特性,比如多态、封装、继承。比如说,GameUserCacheInstance可以选择从XXXCache类继承下来,同时实现IXXXComparable接口
静态类只能包括静态成员,比如static variables, static methods,无非从其它类继承。

----

PS,你的这个GameUserCacheInstance最好加上sealed关键字
------解决方案--------------------
正如楼上所说,对于非继承的情况,单例模式根本不需要,但是又和楼上有不同,楼上说最好加上sealed关键字,其实刚好相反,这里最好做出abstract(抽象类),让各种类继承它,而它内部的单例永远不是自己本身(抽象类不可能实例化),永远只能是它的派生类。这样的单例模式就实现了多态的需求。不过楼主你给的例子真应该用静态类替代,完全没必要搞成那样。