博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中的延迟加载
阅读量:4681 次
发布时间:2019-06-09

本文共 3277 字,大约阅读时间需要 10 分钟。

什么是延迟加载?  

  延迟加载顾名思义就是:推迟加载的时机,当真正使用的时候才加载

  通常在创建一个大对象时,有些属性我们可以在使用到的时候才去创建(设置属性的值),这个可以有效的提升系统性能。  

示例:

//定义了一个Hero类型public class Hero{    public string Name{
get;set;} public string FullName{
get;set;} public Skill objSkill; public Hero(string name) { Name=name; FullName="Super "+name; objSkill=new Skill(name); }}//定义一个Skill类型public class Skill{ public string Name{
get;set;} public int Power{
get;set;} public Skill(string name) { Name=name; Power=name.Length; }}public class Program{ public static void Main(string[] args) { Hero hero=new Hero("qi da sheng"); //此时我只想获取Hero的FullName,但是同时调用Skill的构造方法,加载了Skill的属性, //初始化Skill需要在内存中开辟一定的空间,造成没必要的空间浪费 Console.WriteLine(hero.FullName); //思考:如果实现在调用Skill.Name的时候才去真正创建Skill对象呢? }}
View Code

改进一

改进一://定义了一个Hero类型public class Hero{    public string Name{
get;set;} public string FullName{
get;set;} //public Skill objSkill; private Skill _skill; public Skill objSkill { get {
return _skill??(new _skill(Name));} } public Hero(string name) { Name=name; FullName="Super "+name; //objSkill=new Skill(name); }}//定义一个Skill类型public class Skill{ public string Name{
get;set;} public int Power{
get;set;} public Skill(string name) { Name=name; Power=name.Length; }}public class Program{ public static void Main(string[] args) { Hero hero=new Hero("qi da sheng"); //此时获取Hero的FullName时并不会去创建Skill的实例 Console.WriteLine(hero.FullName); //真正用到Skill.Name时才会创建Skill的实例,从而实现了延迟加载效果? Console.WriteLine(hero.ObjSkill.Power); //思考2:有没有其他更好的方法? }}
View Code

改进二

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Demo_Lazy{    //定义了一个Hero类型    public class Hero    {        public string Name { get; set; }        public string FullName { get; set; }        private readonly Lazy
skill; public Skill objSkill { get { return skill.Value; } } public Hero(string name) { Name = name; FullName = "Super " + name; skill = new Lazy
(() => new Skill(Name)); } } //定义一个Skill类型 public class Skill { public string Name { get; set; } public int Power { get; set; } public Skill(string name) { Name = name; Power = name.Length; } } public class Program { public static void Main(string[] args) { Hero hero = new Hero("qi da sheng"); //此时获取Hero的FullName时并不会去创建Skill的实例 Console.WriteLine(hero.FullName); //真正用到Skill.Name时才会创建Skill的实例,从而实现了延迟加载效果 Console.WriteLine(hero.objSkill.Power); Console.Read(); } }}
View Code

Lazy<T>的优势

那么既然我们已经可以用属性缓存的方法实现, 为什么还要引入Lazy<T> ?

至少Lazy<T> 有以下几点优势:

  1. 它具有 LazyThreadSafetyMode, 但是我们一般不使用它, 除非是很关键的情况下(在此略去181个字) 
  2. 它使属性的定义行更加简单 
  3. 从语义上来讲, 它更加明确, 更加具有可读性 
  4. 它允许null为有效值

参考:

 

转载于:https://www.cnblogs.com/qianxingdewoniu/p/5654287.html

你可能感兴趣的文章
SpringBoot2.x集成WebSocket
查看>>
newFixedThreadPool固定线程使用
查看>>
Kruskal-Wallis Test and Friedman test
查看>>
011
查看>>
第一次的博客~
查看>>
iOS-绘图(Quartz2D)的简单使用(原创)
查看>>
D3.js的基础部分之数组的处理 映射(Map)(v3版本)
查看>>
mysql5.7.22安装步骤
查看>>
利用set排序数组并且去掉重复的数组元素
查看>>
那些实用的Nginx规则
查看>>
经典问题和算法
查看>>
php 部署在iis HTTP 错误 500.0 - Internal Server Error 无法在<fastCGI>应用程序配置中找到<handler> scriptProcessor...
查看>>
一些模板
查看>>
【转】Linux上的free命令详解
查看>>
Android--很实用的图片工具类
查看>>
centos下/etc/sysconfig/下找不到iptables文件
查看>>
linux安装jdk
查看>>
JAVA Http Basic auth
查看>>
Python3.6全栈开发实例[002]
查看>>
转载: 8天学通MongoDB——第四天 索引操作
查看>>