距离上次发表博客已经有几年了. 对于没能坚持更新博客,实在是感觉到甚是惭愧.
闲言少叙, 直接切入主题.
背景最近一直在对于公司一个网络通信服务程序使用.net core 进行重构.重构的目的有两个:一是让程序能够跨平台运行. 二是优化程序代码结构是程序的可维护性有所提升. 重构的过程主要由我来设计底层的架构. 在这个过程中,由于我对C# 泛型的理解还不够深入,所以在这个方面我就犯了个错误. 希望本文能把我犯的这个错误阐述清楚, 如果能帮助园里其他朋友避免这个问题当然是最好的了.
早前的设计先用一张图来描述早前的代码结构
Singleton
base
Child1 和Child2: 相当于不同模块的业务逻辑实现.
我期望的结果是base
代码的实现
Singleton
public abstract class Singletonwhere T : new() { /// /// 锁定对象 /// private static readonly object locker = new object(); ////// T 的实例 /// static T instance = default(T); ////// T 的实例 /// public static T Instance { get { if (null == instance) { lock (locker) { if (null == instance) { instance = new T(); } } } return instance; } } }
base
public class base: Singleton where T : new() { protected static object Object { set; get; } static base() { Object = new object(); } }
Child1 和Child2
public class Child1 : base{ }public class Child2 : base { }
我以为 base的静态构造函数只会执行一次. 可是当我在程序里使用 Child1.Instance 和 Child2.Instance 时发现, base的静态构造函数被执行了2次. 那么Child1.Instance的Object和Child2.Instance的Object对象一定不是同一个.
那么问题出现在什么地方了呢? 答案其实挺简单的:系统认为 base
如果要达到我设计的目标应该怎么做呢?
修正的设计还是先上类图.
base:
public class base
{ protected static object Object { set; get; } static base()
{
Object = new object();
}
}Singleton:
public abstract class Singleton: base where T : new() { /// /// 锁定对象 /// private static readonly object locker = new object(); ////// T 的实例 /// static T instance = default(T); ////// T 的实例 /// public static T Instance { get { if (null == instance) { lock (locker) { if (null == instance) { instance = new T(); } } } return instance; } } }
Child1 和Child2:
public class Child1 : Singleton{ }public class Child2 : Singleton { }
由Singleton 来继承base.然后Child1 和Child2来继承Singleton. 这样问题就都解决了.
作者:詹姆斯.辛
原文出处: https://www.cnblogs.com/james2010/p/10483645.html



