C#泛型设计需要注意的一个小陷阱

2020-01-05 10:10:55王振洲
和 Base<Child2>并不相同. 相当于在系统里定义了Base_Child1 和Base_Child2两个类. 如果我们这么理解这个问题 ,那么Base的静态构造函数被执行了2次就不难理解了.(我觉得我已经把这个问题的成因描述清楚了,如果您没理解,欢迎在下面评论.)

如果要达到我设计的目标应该怎么做呢?

修正的设计

还是先上类图.

C#,泛型设计

Base:


public class Base
{
 protected static object Object { set; get; }

 static Base()
 {
  Object = new object();
 }
}

Singleton:


public abstract class Singleton<T>: Base where T : new()
{
  /// <summary>
  /// 锁定对象
  /// </summary>
  private static readonly object locker = new object();
  /// <summary>
  /// T 的实例
  /// </summary>
  static T instance = default(T);
  /// <summary>
  /// T 的实例
  /// </summary>
  public static T Instance
  {
   get
   {
    if (null == instance)
    {
     lock (locker)
     {
      if (null == instance)
      {
       instance = new T();
      }
     }
    }
    return instance;
   }
  }
}

Child1 和Child2: