C#中延迟初始化实现原理的一点浅见。
定义
延迟初始化:一个对象的延迟初始化意味着它的创建被推迟到它第一次使用。(对于本主题,延迟初始化和延迟实例化是同义词。)延迟初始化主要用于提高性能、避免浪费计算和减少程序内存需求。
用法及简单介绍
关于解决方法,微软给出了三种解决方案,这里主要聊Lazy<T>。

用法没什么好聊的,一句代码搞定。
主要属性有两个,第一个是Value, 用于获取初始化的model值。

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

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

网上对于它的介绍有很多,我就不多废话了,直奔主题。
主要逻辑实现
我们先看一下元数据。

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

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


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

可这tmd不还是私有方法吗?玩人呢?不过事到如今,只好故技重施,再来一把。功夫不负有心人,最终找到了终点:Value属性(这也算得上是首尾照应了……)
结论
到这里我们终于明白了,别看微软说的大词满天飞,其实实现方法不复杂,只是在我们调用Value属性时候,它才去执行获取值。
C#中延迟初始化实现原理的一点浅见。的更多相关文章
- Python中__get__, __getattr__, __getattribute__的区别及延迟初始化
本节知识点 1.__get__, __getattr__, __getattribute__的区别 2.__getattr__巧妙应用 3.延迟初始化(lazy property) 1.__get__ ...
- [整理].net中的延迟初始化器
LazyInitializer类 private void EnsureInitialized() { LazyInitializer.EnsureInitialized(ref _initializ ...
- 不要使用 Dispatcher.Invoke,因为它可能在你的延迟初始化 Lazy 中导致死锁
WPF 中为了 UI 的跨线程访问,提供了 Dispatcher 线程模型.其 Invoke 方法,无论在哪个线程调用,都可以让传入的方法回到 UI 线程. 然而,如果你在 Lazy 上下文中使用了 ...
- JavaScript中实现DI的原理(二)
JavaScript中实现DI的原理 在JavaScript中实现DI,看起来难,实际上原理很简单,它的核心技术是Function对象的toString().我们都知道,对一个函数对象执行toStri ...
- 双重检查锁定与延迟初始化(转自infoq)
很好的文章,转自http://www.infoq.com/cn/articles/double-checked-locking-with-delay-initialization 在java程序中,有 ...
- Spring点滴九:Spring bean的延迟初始化
Spring bean延迟初始化: 官网API: By default, ApplicationContext implementations eagerly create and configure ...
- spring3: 延迟初始化Bean
3.3.1 延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 “lazy- ...
- C#性能优化:延迟初始化Lazy
1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延迟初始化出现于.NET 4.0,主要用于 ...
- C++中string的实现原理
C++中string的实现原理 背景 当我刚开始学习C++,对C还是有一部分的了解,所以以C的思维去学C++,导致我很长一段时间的学习都处于一个懵逼的状态,C++的各种特性,标准库,模板还有版本的迭代 ...
- Kotlin属性揭秘与延迟初始化特性
在上一次https://www.cnblogs.com/webor2006/p/11210181.html学习了Kotlin的伴生对象,这次来学习属性相关的东东. 属性揭秘: 先声明一个属性: 没啥可 ...
随机推荐
- JZOJ 5343. 【NOIP2017模拟9.3A组】健美猫
题面 其中 \(1 \leq n \leq 2 \times 10^6\) 分析 考虑每次移动,发现负数对答案贡献少 \(1\),非负数多 \(1\) 每次移动都加了 \(1\) 负数变非负数关键点在 ...
- uWSGI 结合 nginx 配置动静分离
uWSGI 结合 nginx 配置动静分离 目录 uWSGI 结合 nginx 配置动静分离 1 环境准备 2 初始配置文件 2.1 uwsgi 配置文件 2.2 Nginx配置文件 2.3 Djan ...
- net core 添加cors,解决跨域问题
ConfigureServices //允许跨域 services.AddCors(options => { options.AddPolicy("any", builder ...
- MogDB 学习笔记之 -- 索引失效
[[toc]]# 概念描述哪些操作会导致分区表的全局索引失效(比如 move partition,drop partition ,truncate partition ,split partition ...
- SAP NOTE 489676 VF188异常
解决方案 VOFM->复制请求->出具发票单据(B) 新建999例程
- Windows常用快捷键(但我本人不太熟知的)
Shift+Ctrl+ESC: 打开任务管理器 Windows+E: 打开文件资源管理器 Windows+R: 运行文件 Windows+Tab: 切换应用程序 Shift+Delete: 永久删除
- max virtual memory areas vm.max_map_count 65530 is too low的解决办法
解决办法 /etc/sysctl.conf加上 vm.max_map_count = 262144 使配置永久生效 执行: sysctl -w vm.max_map_count=262144 使配置立 ...
- WeNet调试
运行: 参照:markdown 问题: CMake Error: Error: generator : Ninja Ninja:提高构建速度 wenet/runtime/libtorch/fc_bas ...
- 403. 青蛙过河 (Hard)
问题描述 403. 青蛙过河 (Hard) 一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子,但是不可以跳入水中. 给你石 ...
- cmake:macro,function中ARGV,ARGN参数的区别
cmake中的宏(macro)和函数(function)都支持动态参数 变量ARGC记录传入的参数个数 变量ARGV0,ARGV1,...顺序代表传入的参数 变量ARGV则是一个包含所有传入参数的li ...