LazyInitializer.EnsureInitialized是frameworks4.0引入的新东西,实现对属性延时初始化的功能,它作用在System.Threading命名空间下,所以,它与多线程有着密切的关系,即当多人同步使用这个方法时,对存储的对象有着某种作用,这是msdn的相关说明:

这个方法可以用于多个执行者初始化Target目录对象。

在多个执行者同时存取这个方法的情况下,可能会建立多个T执行个体,但只有一个执行个体会存储至target。在些类情况下,这个方法将不会放置未储存的对象。如果这类对象必须被放置,则由呼叫端判断未使的对象,然后再对物件进行适当的放置。

对于概念不清楚的同步,没有关系,看下面的例子如完全明白了,呵呵

下面的实例介绍了对属性的两个初始化,并进行比较,延时初始化的好处,即在对象使用时再去初始化它当一个方法体中,如果一个对象初始化了一次,不要再进行重复的初始化工作。

代码1,展现了性能不好的情况

代码2,展现了优化的情况

代码3,微软为了我们进行了封装,在多线程中表现更好

代码1

  class TestLazyInitializer1{public People People{get{return new People();}}public void Print1(){Console.WriteLine(People.Name);}public void Print2(){Console.WriteLine(People.Name);}}

代码2:

 class TestLazyInitializer2{People _people;public People People{get{return _people == null? (_people = new People()): _people;}}public void Print1(){Console.WriteLine(People.Name);}public void Print2(){Console.WriteLine(People.Name);}}

代码3

 class TestLazyInitializer{private People _people;/// <summary>/// 延时初始化指定属性/// </summary>public People People{get{return LazyInitializer.EnsureInitialized(ref _people, () =>{return new People();});}}public void Print1(){Console.WriteLine(People.Name);}public void Print2(){Console.WriteLine(People.Name);}}

而它们运行的结果,我们可想而知了,当一个类中多次使用同一个对象时,性能不好的,返回的Name(当前时间),肯定是不同的,而性能好的,只初始化一次的,返回的Name(当前时间)肯定是一个值,呵呵。

感谢阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:基础才是重中之重~LazyInitializer.EnsureInitialized对属性实现化的性能优化,如需转载请自行联系原博主。

基础才是重中之重~LazyInitializer.EnsureInitialized对属性实现化的性能优化相关推荐

  1. 基础才是重中之重~类是怎么执行的

    回到目录 对于一个程序员来说,有必要知道一个概念的同时也解它的执行过程,这样对于写出更好更安全的程序是有帮助的. 大牛们不是一天就成为大牛的,而是经过一步一步的实践,不断的知识的积累才成为大牛的,呵呵 ...

  2. 基础才是重中之重~再说面向接口的编程

    回到目录 之前在我的文章中有对接口进行过讲解,但感觉讲的还是不够清晰,不够利针见血,这次我把面向接口的编程里,自认为比较核心的两点说一下: 接口详细介绍请看我的这篇文章 基础才是重中之重~为什么C#有 ...

  3. 基础才是重中之重~通过人类的生活来学习Delegate

    一个人(people),在他60岁之后,就宣布进入晚年了,在这个期间要多注意身体,多体检. namespace NET基础才是重中之重{/// <summary>/// 人类/// < ...

  4. 第二十二回  基础才是重中之重~ThreadStatic静态字段在每个线程里的唯一性

    static修饰符我们不会陌生,它代表静态,可以修饰你的类,方法,字段和属性等等,今天主要说一个为静态字段加ThreadStatic特性会给程序代来什么样的变化.静态字段static field,我更 ...

  5. 基础才是重中之重~方法override详解

    回到 目录 之所以写这篇文章,完全是因为这次代码审核,这次代码审核过程当中,出现了很多我认为基础知识不够扎实的问题,所以,打算把它们记录下来,共大家分享. 方法的override,即方法的覆写或者重写 ...

  6. 基础才是重中之重~.net中的显式事务与隐式事务

    回到目录 .net中的事务可以分为显式的和稳式的,显式的就是说需要我们手动去指定事务的提交和回滚,而稳式的是.net帮助我们进行管理的,当你的事务代码段没有发生异常时,它会帮助我们进行提交,反之,进行 ...

  7. 基础才是重中之重~何为原子化操作

    占占定义: 原子化操作,操作原子化,这在软件开发中经常被听到,那到底什么是操作原子化呢,其实从字面上不难理解,原子化就是一体化,整体化,原子化操作就是将多个操作组合在一起,要么这个组合一起发生,要么一 ...

  8. 基础才是重中之重~DictionaryK,V里V的设计决定的性能

    回到目录 字典对象Dictionary<K,V>我们经常会用到,而在大数据环境下,字典使用不当可能引起性能问题,严重的可能引起内在的溢出! 字典的值建议为简单类型,反正使用Tuple< ...

  9. 基础才是重中之重~用好configSections让配置信息更规范

    对于小型项目来说,配置信息可以通过appSettings进行配置,而如果配置信息太多,appSettings显得有些乱,而且在开发人员调用时,也不够友好,节点名称很容易写错,这时,我们有几种解决方案 ...

  10. 基础才是重中之重~开发人员应用学会用throw

    回到目录 无论是.net还是java,在开发程序时都难免会用到throw关键字,对于初学者一般会认为它与try...catch捆绑在一起,这当然是错误的,事实上,throw的一个最重要的作用就是: 让 ...

最新文章

  1. 怎么把加载图标去掉_怎样在PCB上绘制图标
  2. 案例驱动python编程入门-python实现事件驱动
  3. mysql 和 sqlserver中备份一张表的区别
  4. css 加随机数 引用_在CSS中生成随机数
  5. iOS之深入解析单例的实现和销毁的底层原理
  6. CVPR 2021 | 如何让GAN的训练更加高效优雅
  7. Black and white
  8. 在spring中该如何使用DTO,以及DTO和Entity的关系
  9. 专访余承东:华为引领行业进步 折叠屏手机即将上市
  10. 【Golang】解决Go test执行单个测试文件提示未定义问题
  11. 通过IO流下载Excel文件
  12. java十六进制与字符串_JAVA十六进制与字符串的转换方法
  13. mysql左连接右连接内连接的含义_MySQL-解释左连接,右连接,内连接,全连接
  14. Bootstrap栅格系统原理
  15. 河北省计算机专业对口大学分数线,计算机对口升学河北分数线2017
  16. android音乐视频播放器,android音乐视频播放器.doc
  17. ROS学习笔记8 —— 状态机在ROS中的实现
  18. iOS教程:移动终端游戏动画设计的12个原则
  19. 自己实现Lock(独享锁)
  20. meta20 无法安装 google play_不ROOT不刷机,小米手机如何安装谷歌 GMS 三件套

热门文章

  1. Source Insight 中查看日文注释
  2. phpize的作用(资料整理)
  3. 基于Visual C++2013拆解世界五百强面试题--题8-数组的排序和查找
  4. 【Android学习笔记】ONTOUCHEVENT, ONCLICK及ONLONGCLICK的调用机制
  5. React --获取服务器数据的两种方式(Axios和FetchJsonp)
  6. ROS-MikroTik-RouterOS-培训认证各种证书
  7. HDU.4352.XHXJ's LIS(数位DP 状压 LIS)
  8. 洛谷P1217回文质数(特判筛选,取巧判断顺序)
  9. 对接门禁分享门禁二维码图片报错
  10. WPF DataGrid 导出Excel