C# 创建单例的多种方式

 更新时间:2021年03月12日 11:33:50   作者:realyrare  
这篇文章主要介绍了C# 创建单例的多种方式,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

关于为什么需要创建单例?这里不过多介绍,具体百度知。

  关于C#  创建单例步骤或条件吧

1、声明静态变量;

2、私有构造函数(无法实例化)

3、静态创建实例的方法;至于我这里的Singleton是sealed ,只是为了防止被继承,其实有私有构造函数足够了,这里只是为了代码可读性。

第一种常见的方式创建单例: 

/// <summary>
 /// 不安全的单例
 /// </summary>
 public sealed class Singleton
 {
  private static Singleton _Singleton;
  private Singleton() { }
  public static Singleton GetSingleton()
  {
   if (_Singleton == null)
   {
    _Singleton = new Singleton();
   }
   return _Singleton;
  }
 }

注:为什么说是不安全的单例,多线程访问时可能会new多个对象...

第二种方式创建单例:

/// <summary>
 /// (多线程)安全单例
 /// </summary>
 public sealed class Singleton
 {
  private static Singleton _Singleton;
  private static readonly object obj = new object();
  private Singleton() { }
  public static Singleton GetSingleton()
  {
   if (_Singleton == null)
   {
    //加锁保护,在多线程下可以确保实例值被创建一次。缺点是每 次获取单例,都要进行判断,涉及到的锁和解锁比较耗资源。
    lock (obj)
    {
     if (_Singleton == null)
     {
      _Singleton = new Singleton();
     }
    }

   }
   return _Singleton;
  }
 }

注:为了解决上面第一种方式创建的不安全实例问题应用而生。

第三种方式创建单例:

/// <summary>
 /// 只读单例
 /// </summary>
 public sealed class Singleton
 {
  private static readonly Singleton instance = new Singleton();
  private Singleton() { }
  public static Singleton Instance
  {
   get
   {
    return instance;
   }
  }
 }
/// <summary>
 /// 基于上面的只读单例=自动属性只读单例(语法糖)
 /// </summary>
 public sealed class Singleton
 {
  private Singleton() { }
  public static Singleton Instance { get; } = new Singleton();
 }

注:只读属性式=>借助readonly属性,instance只被初始化一次,同样达到了单例的效果。在引用函数执行第一句话之前,instance其实已经被赋值了,并不是预期的 只有到访问Instance变量时才创建对象。

第四种方式创建单例:

/// <summary>
 /// Singleton中加上静态构造函数。
 /// </summary>
 public sealed class Singleton
 {
  public static readonly Singleton instance = new Singleton();
  private Singleton()
  {
   Console.WriteLine("初始化1!");
  }
  static Singleton()
  {
  }
  public static Singleton Instance
  {
   get { return instance; }
  }
 }

注:为了解决(第三种只读属性实例)在执行第一句代码之前,实例已经被初始化问题。

第五种方式创建单例:

/// <summary>
 /// 使用Lazy创建单例,默认是线程安全的
 /// </summary>
 public sealed class Singleton
 {
  private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(() => new Singleton());//
  private Singleton() { }
  public static Singleton Instance
  {
   get
   {
    return instance.Value;
   }
  }
 }
// 贴一下关于上面Lazy<T> s=new Lazy<T>()参数的定义;
  // 摘要:
  // 初始化System.Lazy`1类的新实例。 懒惰初始化时
   // 发生时,使用指定的初始化函数和初始化模式。
  
  // 参数:
  // valueFactory:
  // 被调用以生成延迟初始化值的委托是必需的参数
  //
  // isThreadSafe:
  //  如果要使此实例可由多个线程同时使用,则为true; false
         //使此实例一次只能由一个线程使用。
  public Lazy(Func<T> valueFactory, bool isThreadSafe);

以上就是C# 创建单例的多种方式的详细内容,更多关于c# 创建单例的资料请关注脚本之家其它相关文章!

相关文章

  • C#使用HttpClient的正确方式你了解吗

    C#使用HttpClient的正确方式你了解吗

    在微服务架构体系中经常需要向特定 URL 地址发送 Http 请求操作,在 .net core 中 httpClient 使用不当会造成灾难性的问题,这篇文章主要来分享 .net core 中通过 IHttpClientFactory 工厂来使用 HttpClient 的正确打开方式
    2021-11-11
  • C#计算矩阵的秩实例分析

    C#计算矩阵的秩实例分析

    这篇文章主要介绍了C#计算矩阵的秩实现方法,以实例形式较为详细的分析了C#计算矩阵秩的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • 获得.net控件的windows句柄的方法

    获得.net控件的windows句柄的方法

    有一个简单的获得控件的句柄的窍门。你将窗体设置为鼠标可捕获,那么你的窗口句柄可以通过使用Windows API捕获。 这个想法在以下的GetHWnd函数中实现:
    2013-04-04
  • C#中Decimal类型截取保留N位小数并且不进行四舍五入操作

    C#中Decimal类型截取保留N位小数并且不进行四舍五入操作

    这篇文章主要介绍了C#中Decimal类型截取保留N位小数并且不进行四舍五入操作,本文给出需求说明和实现代码,需要的朋友可以参考下
    2015-06-06
  • C# wpf Canvas中实现控件拖动调整大小的示例

    C# wpf Canvas中实现控件拖动调整大小的示例

    本文主要介绍了C# wpf Canvas中实现控件拖动调整大小的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C# 添加、修改以及删除Excel迷你图表的实现方法

    C# 添加、修改以及删除Excel迷你图表的实现方法

    下面小编就为大家分享一篇C# 添加、修改以及删除Excel迷你图表的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • C#中泛型容器Stack<T>的用法并实现”撤销/重做”功能

    C#中泛型容器Stack<T>的用法并实现”撤销/重做”功能

    这篇文章介绍了C#中泛型容器Stack<T>的用法并实现”撤销/重做”功能,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • C#实战之备忘录的制作详解

    C#实战之备忘录的制作详解

    这篇文章主要为大家介绍了如何利用C#制作一个备忘录,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以学习一下
    2022-02-02
  • C#实现的算24点游戏算法实例分析

    C#实现的算24点游戏算法实例分析

    这篇文章主要介绍了C#实现的算24点游戏算法,实例分析了算24点游戏相关的运算技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • c#创建windows服务入门教程实例

    c#创建windows服务入门教程实例

    windows服务是windows系统中一类特殊的应用程序,一般情况下它们只会在后台运行,不会影响前台操作,非常适合做一些不需要用户参与的而又需要长时间执行的任务
    2014-04-04

最新评论