单例类与静态类在c#中的区别是什么
创始人
2024-12-28 08:01:10
0次

1.设计模式:单例模式

单例模式:属于设计模式中创建类型的模式,通过单例模式的方法创建的类,在当前程序中只有一个实例,当然可以实现为线程安全的单例。

这里简单复习下创建代码:

1.1 使用时分配,

使用时实例化,多线程应用时,使用不当会有线程安全问题。

public class SingletonA
 {
  //私有成员,使用时分配内存
  private static SingletonA _instance = null;
  //私有构造,杜绝直接new类
  private SingletonA() { }

  //获取实例
  public static SingletonA GetInstance ()
  { 

   if (_instance == null)
   {
    _instance = new SingletonA();
   }
   return _instance;
  }
 }

1.2 声明时实例化

声明实例时实例化,多线程应用时,使用不当会有线程安全问题。

 public class SingletonB
 {
  //私有静态成员,声明类实例时,分配
  private static readonly SingletonB _instance = new SingletonB();
  //私有构造,杜绝直接new类
  private SingletonB() { }
  public static SingletonB GetInstance()
  {   
   return _instance;
  }
 }

1.3 双检锁

推荐这个,经典的线程安全单例实现

public class SingletonD
 {
  private static SingletonD _instance = null;
  private static readonly object _lockObject = new object();
  private SingletonD() { }
  public static SingletonD GetInstance()
  {
   if (_instance == null)
   {
    lock (_lockObject)
    {
     if (_instance == null)
      _instance = new SingletonD();
    }
   }
   return _instance;
  }
 }

1.4 .net 特性保证的线程安全

最精简版

public sealed class SingletonC
 {
  private SingletonC() { }
  public static readonly SingletonC Instance = new SingletonC();
 }

1.5 使用DI依赖注入时的实现

//FileLogger只需要定义成一般的类即可,无需按照单例模式进行实现,当然也不能是静态类。

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews();
  services.AddSingleton();
}

2. 单例类和静态类的比较

我们基于以下几个要点进行比较

  • 是否支持依赖注入

  • 内存管理是怎样的

  • 可扩展性

  • 可测试性

静态类形如:

public static class StaticExample
 {
  private static readonly object lockObj = new object();
  public static void Log(string message)
  {
   //Write code here to log data.
  }
 }
特性比较静态类单例类
是否支持依赖注入否,编译时提示静态类型不能作为类型参数支持
内存管理是怎样的静态类存储在托管堆的high frequency heap,仅当应用程序卸载时,才释放内存单例类的单个实例是静态的,因此也保存在high frequency heap,当应用程序卸载时,才释放内存。但是,与只能具有静态对象的静态类不同,单例类可以同时具有静态和非静态对象。因此,从内存管理的角度来看,当您使用单例类时,可以利用垃圾回收管理对象。
可扩展性您不能继承静态类并覆盖其方法 ;静态类不能具有扩展方法单例类通常包含一个私有构造函数,并标记为已密封,以指示它既不能实例化也不能继承;因此,只有在单例类中具有非私有构造函数的情况下,才可以扩展单例类;单例类可以具有扩展方法
可测试性模拟静态类非常困难,特别是在包含静态对象的时候。当然如果是只有静态方法,且幂等则还是很容易测试的测试单例类很容易

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...