C#基础 延迟加载介绍与实例

所属分类: 软件编程 / C#教程 阅读数: 54
收藏 0 赞 0 分享

延迟加载(lazy loading) 设计模式是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据(读取属性值)的时候,才真正执行数据加载操作.

为了便于理解, 我们来建立一个场景, 假设我们要构造一个Hero(英雄) 类, 每个Hero 有自己的名字和(SpecialSkill)特殊技能.
建模
这是一种建立的方法:

复制代码 代码如下:

public class Hero
{
    public string FullName { get; set; }
    public string Name { get; set; }
    public SpecialSkill Skill{ get; set; }

    public Hero(string name)
    {
        Name = name;
        FullName = "Super " + name;
        Skill = new SpecialSkill(name);
    }
}
public class SpecialSkill
{
    public int Power { get; set; }
    public string SkillName { get; set; }
    public int StrengthSpent { get; set; }
    public SpecialSkill(string name)
    {
        Console.WriteLine("loading special skill .....");
        Power = name.Length;
        StrengthSpent = name.Length * 3;
        SkillName = name + " Blazing";
        Console.WriteLine(SkillName + ",... this's what makes a legend!");
    }
}
class Program
{
    static void Main(string[] args)
    {
        Hero hero = new Hero("wukong");           
        Console.WriteLine("\n\n.......................Press Enter to continue.......................\n\n");
        Console.Read();
        Console.WriteLine("Hero's special skill: " + hero.Skill.SkillName);
        Console.Read();
        Console.Read();
    }
}


运行程序后输出如下, 这个例子非常的容易理解, 结果也是显然的.

它的缺点是, 当运行Hero 构造函数的时候, SpecialSkill 的所有属性都已经加载了. 如果我们只想获取这个Hero 的FullName, 我们也加载了SpecialSkill 所有值.

属性的加载延迟
在没有Lazy<T> 以前我们可以这样做:

复制代码 代码如下:

public class Hero
 {
     public string FullName { get; set; }
     public string Name { get; set; }
     private SpecialSkill skill;
     public SpecialSkill Skill
     {
         get { return skill ?? (skill = new SpecialSkill(Name)); }
     }
     public Hero(string name)
     {
         Name = name;
         FullName = "Super " + name;
        

     }
 }


即: 修改属性SpecialSkill的加载方法. 那么当我们再运行程序时, 得到的输出就是:

非常好! 这就是我们要的效果, 这样可以让系统更加的有效率.

Lazy<T>
当net framework 引入了Lazy<T> 类后, 我们也可以使用它来实现:

复制代码 代码如下:

public class Hero
{
    public string FullName { get; set; }
    public string Name { get; set; }

    private readonly Lazy<SpecialSkill> skill;
    public SpecialSkill Skill
    {
        get { return skill.Value; }
    }

    public Hero(string name)
    {
        Name = name;
        FullName = "Super " + name;

        skill = new Lazy<SpecialSkill>(() => new SpecialSkill(name));
    }
}


Lazy<T>提供对延迟初始化的支持。而 Lazy<T> 中的一个属性 Value, 则是获取当前 Lazy<T> 实例的延迟初始化值。

Lazy<T>的优势
那么既然我们已经可以用属性缓存的方法实现, 为什么还要引入Lazy<T> ?
至少Lazy<T> 有以下几点优势:
它具有 LazyThreadSafetyMode, 但是我们一般不使用它, 除非是很关键的情况下(在此略去181个字)
它使属性的定义行更加简单
从语义上来讲, 它更加明确, 更加具有可读性
它允许null为有效值

更多精彩内容其他人还在看

C#中Datetimepicker出现问题的解决方法

这篇文章主要给大家介绍了关于C#中Datetimepicker出现问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C# SQLite数据库入门使用说明

这篇文章主要给大家介绍了关于C#中SQLite数据库入门使用的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C#实现批量下载图片到本地示例代码

这篇文章主要给大家介绍了关于C#如何实现批量下载图片到本地的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

如何获取C#中方法的执行时间以及其代码注入详解

这篇文章主要给大家介绍了关于如何获取C#中方法的执行时间以及其代码注入的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
收藏 0 赞 0 分享

C#中通过LRU实现通用高效的超时连接探测

这篇文章主要介绍了c#中通过LRU实现通用高效的超时连接探测,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
收藏 0 赞 0 分享

如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C#程序启动项的设置方法

这篇文章主要为大家详细介绍了C#程序启动项的设置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

c#爬虫爬取京东的商品信息

这篇文章主要给大家介绍了关于利用c#爬虫爬取京东商品信息的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们随着小编来一起学习学习吧
收藏 0 赞 0 分享

C#随机数生成字母金字塔

这篇文章主要为大家详细介绍了C#随机数生成字母金字塔,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

WPF实现窗体中的悬浮按钮

这篇文章主要为大家详细介绍了WPF实现窗体中的悬浮按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多