延迟实例化 Lazy<T>
之前写的设计模式 单例模式中,推荐了使用Lazy<T>来达到线程安全和减少系统资源消耗的作用。
作用及优点:
创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了。
示例代码1:(不使用参数Lazy<T>())
class Program
{
static void Main(string[] args)
{
Lazy<Teacher> lazy = new Lazy<Teacher>();//延迟实例化
Student s = new Student();//实例化
Console.WriteLine(lazy.Value.Name);
Console.WriteLine(s.Name);
}
}
class Student
{
public string Name => "StudentA";
public Student()
{
Console.WriteLine("Student");
}
}
class Teacher
{
public string Name => "TeacherA";
public Teacher()
{
Console.WriteLine("Teacher");
}
}
运行结果:

从中我们很容易的看出来了Teacher类实例化被延迟了。观众朋友们可以试一试吧两个打印换下位置。最终可以发现只有在延迟实例化的对象被使用时才会真正实例化。(没有参数实例化类时,调用的是默认构造函数)
示例代码2:(使用Func<T>参数Lazy<T>(Func<T>))
class Program
{
static void Main(string[] args)
{
string a = "lazy";
Lazy<Student> s = new Lazy<Student>(()=>new Student(a));//指定构造函数(方便区别选择了有参构造函数)
Console.WriteLine(s.Value.Name);
}
}
class Student
{
public string Name => "StudentA";
public Student()
{
Console.WriteLine("Student");
}
public Student(string a)
{
Console.WriteLine(a);
}
}
运行结果:

从操作结果中可以看出,延迟实例化调用了了指定的构造函数。Func<T>是一个带返回值的委托。
参考:
同时我还发现这样一个问题:我之后会看看这个应该怎么描述 如果有知道的大牛希望能不吝赐教。
string a = "lazy";
Lazy<Student> s = new Lazy<Student>(()=>new
Student(a));
a = "";//修改a
Console.WriteLine(s.Value.Name);
/*输出结果:
/*1234
/*StudentA
感觉合情合理 但是不清楚应该怎么描述。
最后附上:Lazy官方介绍地址
延迟实例化 Lazy<T>的更多相关文章
- C#性能优化:延迟初始化Lazy<T>
1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延迟初始化出现于.NET 4.0,主要用于 ...
- C#性能优化:延迟初始化Lazy
1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延迟初始化出现于.NET 4.0,主要用于 ...
- C#延迟初始化Lazy<T>
1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延迟初始化出现于.NET 4.0,主要用于 ...
- Spring(3.2.3) - Beans(7): 延迟实例化
默认情况下,Spring IoC 容器启动后,在初始化过程中,会以单例模式创建并配置所有使用 singleton 定义的 Bean 的实例.通常情况下,提前实例化 Bean 是可取的,因为这样在配置中 ...
- bean的生命周期以及延迟实例化
可以指定bean的初始化创建的时候调用的方法,以及销毁的时候调用的方法. 通过指定中的init-method和destroy-method方法指定bean的创建和销毁的时候执行类中的方法. 把lazy ...
- 不要使用 Dispatcher.Invoke,因为它可能在你的延迟初始化 Lazy 中导致死锁
WPF 中为了 UI 的跨线程访问,提供了 Dispatcher 线程模型.其 Invoke 方法,无论在哪个线程调用,都可以让传入的方法回到 UI 线程. 然而,如果你在 Lazy 上下文中使用了 ...
- Spring - IoC(7): 延迟实例化
默认情况下,Spring IoC 容器启动后,在初始化过程中,会以单例模式创建并配置所有使用 singleton 定义的 Bean 的实例.通常情况下,提前实例化 Bean 是可取的,因为这样在配置中 ...
- 依赖注入在 dotnet core 中实现与使用:3 使用 Lazy<T> 延迟实例化
有些对象我们并不想一开始就实例化,由于性能或者功能的考虑,希望等到使用的时候再实例化.考虑存在一个类 A, 它使用了依赖的类 B,在 A 中,只有某些不常用到的方法会涉及调用 B 中的方法,多数情况下 ...
- 延迟初始化Lazy
延迟初始化出现于.NET 4.0,主要用于提高性能,避免浪费计算,并减少程序内存要求.也可以称为,按需加载. 基本语法: Lazy<T> xx = new Lazy<T>(); ...
随机推荐
- 机器学习(4)Hoeffding Inequality--界定概率边界
问题 假设空间的样本复杂度(sample complexity):随着问题规模的增长导致所需训练样本的增长称为sample complexity. 实际情况中,最有可能限制学习器成功的因素是训练数据的 ...
- 21. leetcode 492
492: 给定一个面积值,求它的长l和宽w.长和宽需满足:长大于等于宽,长和宽的差值尽可能小,长乘宽等于面积. 思路:先将l和w初始化为sqrt(area),然后看l*w是否等于面积,如果等于则返回l ...
- [硬件]_ELVE_VS2015下opencv3.3的配置问题
0x00 引言 最近想搞一下摄像头,但是我的Windows版本是64位的,opencv3.3貌似也只支持64位系统了,所以就配置一下win10+vs2015+opencv3.3的环境变量,具体下载和 ...
- 阿里消息队列中间件 RocketMQ 源码分析 —— Message 拉取与消费(上)
- trie从入门到入殓
trie是什么?1. 字典树 2.集合 (其实两个都对啊喂) 一颗普通的trie树一般类似于这样(图片来源于http://dongxicheng.org/structure/trietree/): 绿 ...
- Python初学时购物车程序练习实例
不多说了,直接上代码: #Author:Lancy Wu product_list=[ ('Iphone',5800), ('Mac Pro',9800), ('Bike', 800), ('Watc ...
- PL/SQL 编程(二)游标、存储过程、函数
游标--数据的缓存区 游标:类似集合,可以让用户像操作数组一样操作查询出来的数据集,实质上,它提供了一种从集合性质的结果中提取单条记录的手段. 可以将游标形象的看成一个变动的光标,他实质上是一个指针, ...
- [算法题] Two Sum
题目内容 题目来源:LeetCode Given an array of integers, return indices of the two numbers such that they add ...
- python发布及调用基于SOAP的webservice
现如今面向服务(SOA)的架构设计已经成为主流,把公用的服务打包成一个个webservice供各方调用是一种非常常用的做法,而应用最广泛的则是基于SOAP协议和wsdl的webservice.本文讲解 ...
- 实验演示Oracle“多版本一致读”和“Cross DDL”
http://space.itpub.net/17203031/viewspace-756336 在各种事务级别中,Oracle实现的是“Read Committed”,也就是读取的数据都是已经提 ...