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

关于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);

转载于:https://www.cnblogs.com/mhg215/p/9795478.html

C# 创建单例你会几种方式?相关推荐

  1. php 恶汉单例,单例模式的两种方式(恶汉式,懒汉式)

    单例模式的两种形式(恶汉式,懒汉式) 单例模式的特点:解决了一个类在内存的唯一性,这个类的对象只有一个. 写单例模式的步骤: 1. 私有修饰构造方法 2. 在本类的成员位置, new 自己类的对象 3 ...

  2. 【Spring实战】—— 3 使用facotry-method创建单例Bean总结

    2019独角兽企业重金招聘Python工程师标准>>> 如果有这样的需求: 1 不想再bean.xml加载的时候实例化bean,而是想把加载bean.xml与实例化对象分离. 2 实 ...

  3. 在Python中创建单例

    这个问题不是为了讨论是否需要单例设计模式 ,是否是反模式,还是针对任何宗教战争,而是要讨论如何以最pythonic的方式在Python中最好地实现此模式. 在这种情况下,我定义"最pytho ...

  4. Spring IOC 容器源码分析 - 创建单例 bean 的过程

    1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...

  5. IOS基础学习日志(七)利用dispatch_once创建单例及使用

    自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,创建单例又有了新的方法,那就是使用dispatch_once函数,当然,随着演进的进行. ...

  6. cocos2d-x中为什么要用sharedXX()函数创建单例类的static对象

    如果在需要用到单例类对象时直接使用static成员对象,那么由于编译器对于不同的编译单元的编译顺序的不确定性,有可能在用到该static对象的时候该对象还没有初始化,而用函数sharedXX()创建单 ...

  7. form表单、控制器中接收表单提交数据的4种方式

    Form表单 这篇文章主要讲的是form表单的提交 之前我们接触过的form表单元素是在Bootstrap框架里面,这次也将用到Bootstrap框架去布局(见图表1)通过Bootstrap框架布局呈 ...

  8. 单链表销毁的两种方式

    单链表销毁的两种方式 在创建和新增申请单链表节点时,需要通过malloc函数手动申请内存空间.如果不对相应内存进行手动释放则会约积累越多,存在内存泄漏风险. 递归销毁 通过递归找到链表最后一个节点,依 ...

  9. 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?

    写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...

  10. server2008 sql 账号只读权限_SQL Server 2008数据库创建用户只读权限的两种方式(转载)...

    最优秀的解决方案: https://www.cnblogs.com/hao-1234-1234/p/12699185.html 其它相关文章: 一.命令行方式创建 新建查询窗口,然后输入以下命令然后执 ...

最新文章

  1. 【HDU】4509 湫湫系列故事——减肥记II (区间覆盖 暴力)
  2. mysql5.6 icp mrr bak_【mysql】关于ICP、MRR、BKA等特性
  3. CSS实现英文或拼音单词首字母大写
  4. contos LINUX搭建LAMP笔记
  5. Yii-upload- 用AJAX上传图片
  6. 关系数据库是如何工作的
  7. MySQL主从复制原理、半同步操作步骤及原理
  8. 作研究需要的绣花功夫
  9. ABAP webservice和log on对话框相关的实现细节调试
  10. Pushing Policy Failed because Checkpoint Firewall “Load on module failed – no memory”
  11. win7 下的 cmdhere 及其他
  12. spark学习-66-源代码:schedulerBackend和taskScheduler的创建(4)-yarn
  13. ubuntu18下vnpy1.9.2的安装
  14. python3.5.2环境下安装对应版本的opencv2(2019.1.25测试成功)
  15. 【机器学习】如何使用随机网格搜索,以缩短网格搜索速度?
  16. Java使用iText PDF导出PDF文档
  17. dispatch_once造成的死锁问题
  18. 360校招之圈地运动
  19. 天津大学计算机专硕_天津大学计算机复试攻略
  20. Windows 10 D盘操作需要管理员权限

热门文章

  1. XAF应用开发教程(七)外观控制模块
  2. CSS 常见的8种选择器 和 文本溢出问题
  3. 4.24口语习语 听力复习
  4. Noise,Error,wighted pocket Algorithm
  5. [LeetCode]Reverse Integer
  6. 关于概率性事件的产品性能和客户体验讨论
  7. 不用代码隐藏自定义列表
  8. CVE-2018-8120 漏洞分析
  9. vue、react隐式实例化
  10. ubunut14.04修改时区,查看版本信息