欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# Lazy Loading

程序员文章站 2023-10-29 11:08:04
前言 按需加载对象延迟加载实际是推迟进行创建对象,直到对其调用后才进行创建初始化,延迟(懒加载)的好处是提高系统性能,避免不必要的计算以及不必要的资源浪费。 常规有这些情况: 对象创建成本高且程序可能不会使用它。 例如,假定内存中有具有 Orders 属性的 Customer 对象,该对象包含大量 ......

前言

按需加载对象延迟加载实际是推迟进行创建对象,直到对其调用后才进行创建初始化,延迟(懒加载)的好处是提高系统性能,避免不必要的计算以及不必要的资源浪费。

常规有这些情况:

  • 对象创建成本高且程序可能不会使用它。 例如,假定内存中有具有 orders 属性的 customer 对象,该对象包含大量 order 对象,初始化这些对象需要数据库连接。 如果用户永远不要求显示 orders 或在计算中使用该数据,则无需使用系统内存或计算周期来创建它。 通过使用 lazy 来声明 orders对象用于迟缓初始化,可以避免在不使用该对象时浪费系统资源。
  • 对象创建成本高,且希望将其创建推迟到其他高成本操作完成后。 例如,假定程序在启动时加载多个对象实例,但是只需立即加载其中一部分。 可以通过推迟初始化不需要的对象,直到创建所需对象,提升程序的启动性能。(来源官方)

示例

创建用户类

 public class user
    {
        public string name { get; set; }

        public int age { get; set; }


        public user() {
            this.name = "name";
            this.age = 0;
        }
    }

默认情况下,lazy 对象是线程安全的。 也就是说,如果构造函数没有指定线程安全性的类型,该函数创建的 lazy 对象是线程安全的。 在多线程方案中,访问线程安全 lazy 对象的 value 属性的第一个线程会为所有线程上的所有后续访问对其初始化,且所有线程共享相同的数据。 因此,哪个线程初始化对象并不重要,争用条件是良性的。

    class program
    {
        static void main(string[] args)
        {
            lazy<user> user = new lazy<user>();
            threadlocal<user> threadlocal = new threadlocal<user>();

            if (!user.isvaluecreated)
                console.writeline("the object is not initialized");
            console.writeline(user.value.name);
            user.value.name = "name1";
            user.value.age = 1;
            console.writeline(user.value.name);
            console.read();
        }
    }        

对象的线程安全性 lazythreadsafetymode mode 参数 布尔 isthreadsafe 参数 没有线程安全性参数
完全线程安全;一次只有一个线程尝试初始化值。 executionandpublication true 可以。
非线程安全。 none false 不适用。
完全线程安全;线程争用以初始化值。 publicationonly 不适用。 不适用。

其中isvaluecreated属性是个boolean类型,我们可以通过此属性去确定当前对象有没有被初始化

C# Lazy Loading

调用后,进行了创建操作

C# Lazy Loading

再说说lazy中几个构造函数,

  • public lazy (bool isthreadsafe)
    isthreadsafe 的布尔参数,该方法参数用于指定是否从多线程访问 value 属性。 如果想要仅从一个线程访问属性,则传入 false 以获取适度的性能优势。 如果想要从多线程访问属性,则传入 true 以指示 lazy 实例正确处理争用条件(初始化时一个线程引发异常)。

  • public lazy (lazythreadsafetymode mode):提供线程安全模式。

  • public lazy (func valuefactory)
    lambda 表达式传递给新的 lazy 对象的构造函数。 下一次访问 value 属性将导致新 lazy 的初始化,并且其 value 属性此后会返回已分配给该属性的新值。

总结

参考: