业务场景:

在项目开发中,经常会遇到特定的对象使用的加载问题,有的实例对象我们创建之后并非需要使用,只是根据业务场景来调用,所以可能会导致很多无效的实例加载

延迟初始化出现于.NET 4.0,主要用于提高性能,避免浪费计算,并减少程序内存要求。也可以称为,按需加载

代码事例:

1.未进行延迟加载的情况

a.创建学生类:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Demo_Lazy_
  8. {
  9. /// <summary>
  10. /// 学生类
  11. /// </summary>
  12. public class Student
  13. {
  14. public Student()
  15. {
  16. ;
  17. Console.WriteLine("调用构造函数");
  18. }
  19. /// <summary>
  20. /// 年龄
  21. /// </summary>
  22. public int Age { get; set; }
  23. }
  24. }

b.程序入口:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Demo_Lazy_
  8. {
  9. class Program
  10. {
  11.  
  12. /// <summary>
  13. /// 程序入口
  14. /// </summary>
  15. /// <param name="args"></param>
  16. static void Main(string[] args)
  17. {
  18. Student student = new Student();
  19. Console.WriteLine(student.Age);
  20. Console.Read();
  21. }
  22. }
  23. }

c.运行结果:

d.结果说明:

程序运行直接调用了构造函数,在使用Student对象之前

2.使用延迟加载

a.创建学生类:(代码如上1)

    b.程序入口:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Demo_Lazy_
  8. {
  9. class Program
  10. {
  11.  
  12. /// <summary>
  13. /// 程序入口
  14. /// </summary>
  15. /// <param name="args"></param>
  16. static void Main(string[] args)
  17. {
  18. Lazy<Student> student = new Lazy<Student>();
  19. Console.WriteLine("已创建实例对象");
  20. Console.WriteLine("是否显示学生年龄?(0否1是)");
  21. string id = Console.ReadLine();
  22. ")
  23. {
  24. Console.WriteLine(student.Value.Age);
  25. }
  26. Console.ReadLine();
  27. }
  28. }
  29. }

  

c.运行结果:

首先输入0结果,结果说明:学生对象已创建,但并没有进行实例化,因为业务中没有进行使用

再次运行,输入1,结果说明:学生对象已创建,调用对象实例化方法

事例总结:

        在针对业务功能开发中,如果有对象创建的开销很大,而并非需要立即使用它;如上例中根据界面输入是否显示学生年龄,来动态决定是否实例化学生对象,如果程序启动中对象是需要立即使用的,不建议使用延迟加载,立即加载将提高程序启动的效率;

注: 

       Lazy默认是线程安全的,在多个线程同时运行的情况下,对象的初始化只会被第一个线程调用执行,后续线程的调用执行不会多次创建/调用对象实例

.NET中的按需加载/延迟加载 Lazy<T>的更多相关文章

  1. webpack中实现按需加载

    webpack中的require.ensure()可以实现按需加载资源包括js,css等,它会给里面require的文件单独打包,不和主文件打包在一起,webpack会自动配置名字,如0.js,1.j ...

  2. vue中路由按需加载的几种方式

    使用vue-cli构建项目后,我们会在Router文件夹下面的index.js里面引入相关的路由组件,如: import Hello from '@/components/Hello' import ...

  3. AngularJS中的按需加载ocLazyLoad

    欢迎大家讨论与指导 : ) 初学者,有不足的地方希望各位指出 一.前言 ocLoayLoad是AngularJS的模块按需加载器.一般在小型项目里,首次加载页面就下载好所有的资源没有什么大问题.但是当 ...

  4. AngularJS中的按需加载ocLazyLoad插件应用;

    一.前言 ocLoayLoad是AngularJS的模块按需加载器.一般在小型项目里,首次加载页面就下载好所有的资源没有什么大问题.但是当我们的网站渐渐庞大起来,这样子的加载策略让网速初始化速度变得越 ...

  5. nuxt中iview按需加载配置

    在plugins/iview.js中修改 初始代码如下 import Vue from 'vue' import iView from 'iview' import locale from 'ivie ...

  6. Angular (SPA) WebPack模块化打包、按需加载解决方案完整实现

    文艺小说-?2F,言情小说-?3F,武侠小说-?9F long long ago time-1-1:A 使用工具,long long A ago time-1-2:A 使用分类工具,long long ...

  7. Vue性能优化之组件按需加载(以及一些常见的性能优化方法)

    关于Vue中的按需加载我就简单介绍一下:大概就是我们所有的东西都会在app.js里面,但是我们并不需要把所有的组件都一次性加载进来,我们可以在需要它的时候再将它加载进来,话不多说,开车! 1.webp ...

  8. vue中的懒加载和按需加载

    懒加载 (1)定义:懒加载也叫延迟加载,即在需要的时候进行加载,随用随载. (2)异步加载的三种表示方法: 1. resolve => require([URL], resolve),支持性好 ...

  9. mybatis 启用延迟加载和按需加载配置

    启用延迟加载和按需加载 Mybatis配置文件中通过两个属性lazyLoadingEnabled和aggressiveLazyLoading来控制延迟加载和按需加载. lazyLoadingEnabl ...

随机推荐

  1. SQLServer导出数据表结构

    SELECT (case when a.colorder=1 then d.name else '' end)表名, a.colorder 字段序号, a.name 字段名, (case when C ...

  2. Mongodb_基本操作UCRD

    网站 Mongodb官网:www.mongodb.org 安装包下载 使用文档 Mongodb国内官方网站:www.mongoing.com 数据库概念 有组织的存放数据 按照不同的需求进行查询 数据 ...

  3. scrapy_数据收集

    什么是数据收集器? 数据以key/value形式存在,收集一些状态,简化数据收集的状态 计算到底发送了多少request等等统计信息 如何对404页面进行设置? 通过response.status等于 ...

  4. 亲测可用的国内maven镜像

    maven作为一个项目管理工具确实非常好用,之前oschina的中央仓库可用,现在oschina的maven服务器关了,于是自己倒腾了一个nexus,苦于自己的服务器是入门级的,下载速度实在让人着急. ...

  5. Servlet--Servlet接口

    servlet主要数据结构 Servlet 接口:主要定义了servlet的生命周期方法 ServletConfig接口:为servlet提供了使用容器服务的若干重要对象和方法. ServletCon ...

  6. Android ButterKnife注解式开发

    在Android开发中findViewById和setOnClickListener解脱写法. 在任意的一个类中 @Bind(R.id.et) EditText editText; @OnClick( ...

  7. css盒子居中定位问题

    在HTML中,div盒子的居中要通过外边距margin和width来控制,首先确定盒子的宽度,然后确定盒子方位并将其平移便可使盒子移到固定位置. <div id="divpic&quo ...

  8. awk进阶整理

    BEGIN{写在前言,我英语不好,有许多地方直接使用的谷歌翻译.为了能理清awk工具使用的思路,详情还要看awk说明书(man awk) 或者http://www.gnu.org/software/g ...

  9. H5 Canvas图像模糊解决办法

    1.最近在用h5的canvas画动画,发现图像特别模糊.后来终于找到罪魁祸首是<meta name="viewport" content="width=device ...

  10. 浅探element-ui2组件源码之upload

    最近不小心更新了element-ui的版本,已经到了2.1.0,以前修改的源码都失效了. 于是重新尝试下面的指令重新修改: git clone https://github.com/ElemeFE/e ...