第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定

C#泛型設(shè)計(jì)的一個小陷阱.

標(biāo)簽:
C#

距离上次发表博客已经有几年了. 对于没能坚持更新博客,实在是感觉到甚是惭愧. 

闲言少叙, 直接切入主题.

背景

最近一直在对于公司一个网络通信服务程序使用.net core 进行重构.重构的目的有两个:一是让程序能够跨平台运行. 二是优化程序代码结构是程序的可维护性有所提升.  重构的过程主要由我来设计底层的架构. 在这个过程中,由于我对C# 泛型的理解还不够深入,所以在这个方面我就犯了个错误. 希望本文能把我犯的这个错误阐述清楚, 如果能帮助园里其他朋友避免这个问题当然是最好的了.

早前的设计

先用一张图来描述早前的代码结构

Singleton<T>:是一个单例的基类, 用来实现单例模式.

Base<T>:则是一个基础类,它有一些静态的属性和方法(例如访问Redis,kafka,数据库等). 这些属性和方法提供给 Child1 和 Child2 去使用.

Child1 和Child2: 相当于不同模块的业务逻辑实现.

 

我期望的结果是Base<T>里面的静态成员在整个程序运行期间只有一份.

 

 代码的实现

Singleton

复制代码

    public abstract class Singleton<T> 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;
            }
        }
    }

复制代码

Base

复制代码

public class Base<T> : Singleton<T> where T : new()
{    protected static object Object { set; get; }    static Base()
    {
        Object = new object();
    }
}

复制代码

Child1 和Child2

复制代码

public class Child1 : Base<Child1>{
}public class Child2 : Base<Child2>{
}

复制代码

 

 

 

我以为 Base的静态构造函数只会执行一次. 可是当我在程序里使用 Child1.Instance 和 Child2.Instance 时发现, Base的静态构造函数被执行了2次. 那么Child1.Instance的Object和Child2.Instance的Object对象一定不是同一个.

那么问题出现在什么地方了呢? 答案其实挺简单的:系统认为 Base<Child1> 和 Base<Child2>并不相同. 相当于在系统里定义了Base_Child1 和Base_Child2两个类. 如果我们这么理解这个问题 ,那么Base的静态构造函数被执行了2次就不难理解了.(我觉得我已经把这个问题的成因描述清楚了,如果您没理解,欢迎在下面评论.)

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

修正的设计

还是先上类图.

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:

复制代码

public class Child1 : Singleton<Child1>{
}public class Child2 : Singleton<Child2>{
}

复制代码

 

由Singleton 来继承Base.然后Child1 和Child2来继承Singleton. 这样问题就都解决了.

作者:詹姆斯.辛

原文出处: https://www.cnblogs.com/james2010/p/10483645.html  

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報(bào)

0/150
提交
取消