C#中延迟初始化实现原理的一点浅见。
2024-09-18 20:34:54
定义
延迟初始化:一个对象的延迟初始化意味着它的创建被推迟到它第一次使用。(对于本主题,延迟初始化和延迟实例化是同义词。)延迟初始化主要用于提高性能、避免浪费计算和减少程序内存需求。
用法及简单介绍
关于解决方法,微软给出了三种解决方案,这里主要聊Lazy<T>。
用法没什么好聊的,一句代码搞定。
主要属性有两个,第一个是Value, 用于获取初始化的model值。
另一个则是IsValueCreated,用于判断model是否被初始化。
除了以上两个属性外,还有LazyThreadSafetyMode这个枚举。
网上对于它的介绍有很多,我就不多废话了,直奔主题。
主要逻辑实现
我们先看一下元数据。
Lazy一共定义了6个构造方法,我们这里主要看第6个。
传入的委托被m_valueFactory接收了数据。那么它是在什么时候被调用的呢?经过一番功夫查找后,发现它是在一个名为“CreateValue”的方法里被调用的。
可是到这里我还是没能解决心中疑惑,它虽然是在这里被调用的,可这是私有方法啊,接下来只好顺藤摸瓜往上找。一段漫长的时光过去了,终于找到了它的“上家”:LazyInitValue。
可这tmd不还是私有方法吗?玩人呢?不过事到如今,只好故技重施,再来一把。功夫不负有心人,最终找到了终点:Value属性(这也算得上是首尾照应了……)
结论
到这里我们终于明白了,别看微软说的大词满天飞,其实实现方法不复杂,只是在我们调用Value属性时候,它才去执行获取值。
最新文章
- 前端网老姚浅谈:怎么学JavaScript?
- CSS3选择器——基本选择器
- php获取实时汇率数据
- bzoj 4066: 简单题
- 使用 getNextException() 来检索已经过批处理的特定元素的异常。 ERRORCODE=-4228, SQLSTATE=null
- java可访问修饰符
- LeetCode之“动态规划”:Triangle
- linux中文件的三种time(atime,mtime,ctime)
- Echart横坐标时间轴滑动
- ASP.NET Core 微服务初探[2]:熔断降级之Polly
- 【数学建模】day10-主成分分析
- luogu P4148 简单题
- 自己对Java的一点看法
- 新项目增加gradlew
- Ubuntu 14.04安装QQ2012
- docker探索-windows10 docker 使用 mysql(二)
- 404 Note Found -(课堂实战)- 项目UML设计(团队)
- TOJ 3176 Challenge from XOR
- jQuery 资料
- StrutsResultSupport的使用