成都创新互联网站制作重庆分公司

C#泛型设计需要注意什么

这篇文章主要为大家展示了“C#泛型设计需要注意什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#泛型设计需要注意什么”这篇文章吧。

成都创新互联公司于2013年创立,先为浪卡子等服务建站,浪卡子等地企业,进行企业商务咨询服务。为浪卡子企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

什么是泛型

我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类型不同。有没有一种办法,在方法中传入通用的数据类型,这样不就可以合并代码了吗?泛型的出现就是专门解决这个问题的。

背景

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

早前的设计

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

C#泛型设计需要注意什么

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

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

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

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

代码的实现

Singleton

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

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并不相同. 相当于在系统里定义了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: 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. 这样问题就都解决了.

以上是“C#泛型设计需要注意什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!


新闻标题:C#泛型设计需要注意什么
网站网址:http://cxhlcq.com/article/gdjgsg.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部