前言
距离上次发表博客已经有几年了. 对于没能坚持更新博客,实在是感觉到甚是惭愧.
闲言少叙, 直接切入主题.
什么是泛型
我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类型不同。有没有一种办法,在方法中传入通用的数据类型,这样不就可以合并代码了吗?泛型的出现就是专门解决这个问题的。
但泛型就简单吗?当然不是,继续往下看..
背景
最近一直在对于公司一个网络通信服务程序使用.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. 这样问题就都解决了.
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对考高分网的支持。



