在C#中创建单例的方法有哪些-创新互联

这期内容当中小编将会给大家带来有关在C#中创建单例的方法有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

绵竹ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!

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


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

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

第二种方式创建单例:

/// 
 /// (多线程)安全单例
 /// 
 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;
  }
 }

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

第三种方式创建单例:

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

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

第四种方式创建单例:

/// 
 /// Singleton中加上静态构造函数。
 /// 
 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; }
  }
 }

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

第五种方式创建单例:

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

上述就是小编为大家分享的在C#中创建单例的方法有哪些了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


新闻名称:在C#中创建单例的方法有哪些-创新互联
链接分享:http://pwwzsj.com/article/dopoph.html