服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 详解C# Lazy Loading(延迟加载)

详解C# Lazy Loading(延迟加载)

2022-11-13 13:53HueiFeng C#

这篇文章主要介绍了C# Lazy Loading(延迟加载)的相关资料,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

前言

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

常规有这些情况:

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

示例

创建用户类

?
1
2
3
4
5
6
7
8
9
10
11
12
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 属性的第一个线程会为所有线程上的所有后续访问对其初始化,且所有线程共享相同的数据。 因此,哪个线程初始化对象并不重要,争用条件是良性的。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 属性此后会返回已分配给该属性的新值。

参考:

https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization

以上就是详解C# Lazy Loading(懒加载)的详细内容,更多关于C# Lazy Loading(懒加载)的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/yyfh/p/11996509.html

延伸 · 阅读

精彩推荐
  • C#C# 实现Distinct将对象按条件去重

    C# 实现Distinct将对象按条件去重

    这篇文章主要介绍了C# 实现Distinct将对象按条件去重,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    lishuangquan19874332022-10-20
  • C#Quartz.Net任务和触发器实现方法详解

    Quartz.Net任务和触发器实现方法详解

    这篇文章主要介绍了Quartz.Net任务和触发器实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可...

    David Huang4522022-10-19
  • C#C#使用Socket实现局域网聊天

    C#使用Socket实现局域网聊天

    这篇文章主要为大家详细介绍了C#使用Socket实现局域网聊天的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    田埂上的梦想3492022-02-23
  • C#C# interface与delegate效能比较的深入解析

    C# interface与delegate效能比较的深入解析

    本篇文章是对C#中interface与delegate的效能比较进行了详细的分析介绍,需要的朋友参考下...

    C#教程网5022020-12-14
  • C#c# 类型的字段和方法设计建议

    c# 类型的字段和方法设计建议

    这篇文章主要介绍了c# 字段和方法设计建议,帮助大家更好的理解和使用c#编程语言,感兴趣的朋友可以了解下...

    一只独行的猿8932022-10-17
  • C#值得永久收藏的 C# 设计模式套路

    值得永久收藏的 C# 设计模式套路

    关于设计模式的说法,网上一搜一大堆,咱就不再去说了。我的理解,设计模式就是很多NB的大佬们总结出来的,用来处理特定情况的标准解决方案。...

    老王Plus10242021-11-10
  • C#深入理解C# DateTime日期格式化

    深入理解C# DateTime日期格式化

    在C#中DateTime是一个包含日期、时间的类型,此类型通过ToString()转换为字符串时,可根据传入给Tostring()的参数转换为多种字符串格式。...

    polk610242021-12-18
  • C#一个读写csv文件的C#类

    一个读写csv文件的C#类

    这篇文章主要为大家详细介绍了一个读写csv文件的C#类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    DODONG11892021-12-30