C# Lazy Loading
前言
按需加载对象延迟加载实际是推迟进行创建对象,直到对其调用后才进行创建初始化,延迟(懒加载)的好处是提高系统性能,避免不必要的计算以及不必要的资源浪费。
常规有这些情况:
- 对象创建成本高且程序可能不会使用它。 例如,假定内存中有具有 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
其中isvaluecreated属性是个boolean类型,我们可以通过此属性去确定当前对象有没有被初始化 调用后,进行了创建操作 再说说lazy中几个构造函数, public lazy (bool isthreadsafe): public lazy (lazythreadsafetymode mode):提供线程安全模式。 public lazy (func 参考:
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
不适用。
不适用。
isthreadsafe 的布尔参数,该方法参数用于指定是否从多线程访问 value 属性。 如果想要仅从一个线程访问属性,则传入 false 以获取适度的性能优势。 如果想要从多线程访问属性,则传入 true 以指示 lazy
lambda 表达式传递给新的 lazy
总结
下一篇: 微服务架构中的Redis