.NET中的按需加载/延迟加载 Lazy<T>

业务场景:

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

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

代码事例:

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

a.创建学生类: 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo_Lazy_
{
    /// <summary>
    /// 学生类
    /// </summary>
    public class Student
    {
        public Student()
        {
            this.Age = 12;
            Console.WriteLine("调用构造函数");
        }
        /// <summary>
        /// 年龄
        /// </summary>
        public int Age { get; set; }
    }
}
View Code

b.程序入口:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo_Lazy_
{
    class Program
    {
        
        /// <summary>
        /// 程序入口
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Student student = new Student();
            Console.WriteLine(student.Age);
            Console.Read();
        }        
    }
}
View Code 

c.运行结果:

 

            d.结果说明:

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

       2.使用延迟加载

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

    b.程序入口:               

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo_Lazy_
{
    class Program
    {

        /// <summary>
        /// 程序入口
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Lazy<Student> student = new Lazy<Student>();
            Console.WriteLine("已创建实例对象");
            Console.WriteLine("是否显示学生年龄?(0否1是)");
            string id = Console.ReadLine();
            if (id == "1")
            {
                Console.WriteLine(student.Value.Age);
            }            
            Console.ReadLine();
        }
    }
}
View Code  

           c.运行结果:

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

            

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

            

事例总结:

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

注: 

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

 

        

            

       

转载于:https://www.cnblogs.com/tiaoshuidenong/p/6378866.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Lazy<T> 是一种 .NET 类型,它可以延迟实例化某个类型直到要使用它时才创建。这对于那些初始化代价较大的类型非常有用,因为它们可以避免浪费资源来实例化未使用的对象。 使用 Lazy<T> 的一种常见方式是在懒单例模式使用。例如,假设有一个 MyClass 类型要很长时间才能实例化,但是我们希望在第一次访问单例时才初始化它。为了做到这一点,我们可以使用 Lazy<T> 来定义单例: ``` private static readonly Lazy<MyClass> instance = new Lazy<MyClass>(() => new MyClass()); public static MyClass Instance => instance.Value; ``` 这样,当我们首次调用 `MyClass.Instance` 时,Lazy<T> 会调用提供的工厂方法来创建 `MyClass` 的实例,并在后续调用返回相同的实例。 ### 回答2: Lazy<T>是一种泛型类,用于延迟对象。Lazy<T>延迟的意思是,只有在第一次访问该对象时才会进行实例化和初始化,之后的访问都直接返回已经创建好的对象。 通常情况下,对象在创建之后会一直存活在内存,即使在实际使用之前。而使用Lazy<T>可以在要的时候再进行对象的创建,从而减少了不必要的资源占用和对象的初始化时间。 Lazy<T>可用于创建那些消耗较大的对象,例如数据库连接、网络请求等。通过使用Lazy<T>,我们可以推迟对这些对象的创建和初始化,减少了启动时间和内存的消耗。 在使用Lazy<T>时,我们要传入一个委托方法(Func<T>),用于在第一次访问该对象时进行实例化。Lazy<T>保证了委托方法的线程安全,并且只执行一次。 Lazy<T>还提供了一些其他的属性和方法,例如Value属性用于获取延迟的对象实例,IsValueCreated属性用于判断延迟的对象是否已经创建,以及ForceCreate方法用于强制创建延迟的对象。 总而言之,Lazy<T>是一种用于实现延迟的泛型类,可以在要的时候再进行对象的创建和初始化,从而提高性能和资源的利用率。 ### 回答3: Lazy<T>是一种类型,它是一个泛型类,用于延迟计算。Lazy<T>表示一个值,该值只有在要时才会被计算,并且在之后的访问会缓存计算结果。 Lazy<T>类可以用于解决在某些情况下计算结果代价很高的问题。它的工作原理是,当我们创建Lazy<T>实例时,它并不立即计算结果,而是只在第一次访问Value属性时才计算并返回结果。在之后的所有访问,Lazy<T>会直接返回缓存的结果,而不再进行计算。 这种延迟计算的方式有助于提高性能,因为在很多情况下,并不是每次访问该值时都要重新计算。Lazy<T>还提供了线程安全的实现,以便在多线程环境可以安全地使用。 使用Lazy<T>时,我们可以通过传递一个委托给Lazy<T>的构造函数来延迟计算。这个委托将在第一次访问Value属性时被调用,并且返回的结果会被缓存起来。之后的访问,Lazy<T>会直接返回这个缓存的结果,而不再调用委托。 总而言之,Lazy<T>是一种用于延迟计算并缓存结果的类型,可以有效提高性能并减少计算代价高的情况下的性能损耗。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值