定义
延迟初始化:一个对象的延迟初始化意味着它的创建被推迟到它第一次使用。(对于本主题,延迟初始化和延迟实例化是同义词。)延迟初始化主要用于提高性能、避免浪费计算和减少程序内存需求。
用法及简单介绍
关于解决方法,微软给出了三种解决方案,这里主要聊Lazy<T>。
用法没什么好聊的,一句代码搞定。
主要属性有两个,第一个是Value, 用于获取初始化的model值。
另一个则是IsValueCreated,用于判断model是否被初始化。
除了以上两个属性外,还有LazyThreadSafetyMode这个枚举。
网上对于它的介绍有很多,我就不多废话了,直奔主题。
主要逻辑实现
我们先看一下元数据。
Lazy一共定义了6个构造方法,我们这里主要看第6个。
传入的委托被m_valueFactory接收了数据。那么它是在什么时候被调用的呢?经过一番功夫查找后,发现它是在一个名为“CreateValue”的方法里被调用的。
可是到这里我还是没能解决心中疑惑,它虽然是在这里被调用的,可这是私有方法啊,接下来只好顺藤摸瓜往上找。一段漫长的时光过去了,终于找到了它的“上家”:LazyInitValue。
可这tmd不还是私有方法吗?玩人呢?不过事到如今,只好故技重施,再来一把。功夫不负有心人,最终找到了终点:Value属性(这也算得上是首尾照应了……)
结论
到这里我们终于明白了,别看微软说的大词满天飞,其实实现方法不复杂,只是在我们调用Value属性时候,它才去执行获取值。