C#中延迟初始化实现原理的一点浅见。

定义

延迟初始化:一个对象的延迟初始化意味着它的创建被推迟到它第一次使用。(对于本主题,延迟初始化延迟实例化是同义词。)延迟初始化主要用于提高性能、避免浪费计算和减少程序内存需求。

用法及简单介绍

关于解决方法,微软给出了三种解决方案,这里主要聊Lazy<T>。

C#中延迟初始化实现原理的一点浅见。

 

 

 用法没什么好聊的,一句代码搞定。

主要属性有两个,第一个是Value, 用于获取初始化的model值。

C#中延迟初始化实现原理的一点浅见。

 

 

另一个则是IsValueCreated,用于判断model是否被初始化。

C#中延迟初始化实现原理的一点浅见。

除了以上两个属性外,还有LazyThreadSafetyMode这个枚举。

C#中延迟初始化实现原理的一点浅见。

 

 网上对于它的介绍有很多,我就不多废话了,直奔主题。

 

 

 主要逻辑实现

我们先看一下元数据。

C#中延迟初始化实现原理的一点浅见。

 

 Lazy一共定义了6个构造方法,我们这里主要看第6个。

C#中延迟初始化实现原理的一点浅见。

 

 传入的委托被m_valueFactory接收了数据。那么它是在什么时候被调用的呢?经过一番功夫查找后,发现它是在一个名为“CreateValue”的方法里被调用的。

C#中延迟初始化实现原理的一点浅见。

 

 

C#中延迟初始化实现原理的一点浅见。

 

 

可是到这里我还是没能解决心中疑惑,它虽然是在这里被调用的,可这是私有方法啊,接下来只好顺藤摸瓜往上找。一段漫长的时光过去了,终于找到了它的“上家”:LazyInitValue。

C#中延迟初始化实现原理的一点浅见。

 

 可这tmd不还是私有方法吗?玩人呢?不过事到如今,只好故技重施,再来一把。功夫不负有心人,最终找到了终点:Value属性(这也算得上是首尾照应了……)C#中延迟初始化实现原理的一点浅见。

 

 

结论

到这里我们终于明白了,别看微软说的大词满天飞,其实实现方法不复杂,只是在我们调用Value属性时候,它才去执行获取值。

 

C#中延迟初始化实现原理的一点浅见。

上一篇:linux开发板设置开机后自动调整时间


下一篇:C# Net MVC 大文件下载几种方式、支持速度限制、资源占用小