.Net组件程序设计之对象生命周期

.Net组件程序设计之对象生命周期

  • .NET 垃圾回收


  • IDisposable()


  • Using语句


.NET 垃圾回收


是CLR管理着垃圾回收器,垃圾回收器监控着托管堆,而我们使用的对象以及系统启动是所需要的一些必备的对象信息都存在于托管堆上,CLR会维护着一个列表(对象引用信息列表).
这个列表里存放的信息就是对应着托管堆中所有对象的信息(引用、被引用信息)每当使用一个新的对象或者是改变一个现有对象的引用CLR都会更新
对象引用信息列表。那么回收器一般什么时候调用呢?

垃圾回收器大多数是在托管堆耗尽的情况下被触发使用 ,也可以通过代码来调用(下面会讲到).

在垃圾回收器调用的时候,会从(对象引用信息列表)开始遍历查看每个对象是否能够到达客户端(使用这些对象的应用程序),如果能够到达则这个对象就被标记可到达并且跳过它(查看对象是否有引用),继续的遍历下面,而且被标记的对象所引用的对象将不会被再次检查。当检查到对象没有引用这些对象的时候,则会回收这些对象,并且进行空间压缩,修改那些有引用对象的地址进行空间压缩。

IDisposable()

在.NET中给我们提供了IDispose接口就是用来释放资源的,看一段示例代码:


 1     public interface IMyinterface
2 {
3 void DoSomeThing();
4 }
5 public class StydyClass:IMyinterface,IDisposable
6 {
7 public void Dispose()
8 {
9 //释放资源
10 }
11 public void DoSomeThing()
12 {
13 //do something
14 }
15 }

看一下客户端调用代码:


1 IMyinterface studyClass = new StudyClass();
2 studyClass.DoSomeThing();
3
4 IDisposable disposable = studyClass as IDisposable;
5 if (disposable != null)
6 {
7 disposable.Dispose();
8 }

这种调用方式很安全啊,如果studyClass没有支持IDisposable,as操作符则会返回NULL值,看起来没什么问题,
但是如果客户端对象是共享的,有很多对象在使用它,那究竟由谁准确的来执行IDisposable.Dispose()。
如果在DoSomeThing()函数执行的时候发生一些错误,那么资源还会被释放吗?

Using语句

C#
支持Using语句,在使用Using语句的时候会帮我们生成一个使用Dispose()方法的try/finally块,当然你的对象必须先支持IDisposable才行。看一下示例代码:


1 using (IMyinterface studyClass = new StudyClass())
2 {
3 studyClass.DoSomeThing();
4 }

如果这样写,编译是不会通过的,并且会提示你,using语句中使用的类型是必须可以隐式转换为System.IDisposable的。当然了,
也是有办法可以让这样的代码编译通过的,让IMyinterface接口也派生于IDisposable。 这样之后就可以这样来写代码:


 1 IMyinterface studyClass = new StudyClass();
2 using (studyClass as IDisposable)
3 {
4 studyClass.DoSomeThing();
5 }
6
7 using (StudyClass studyClass = new StudyClass())
8 {
9 studyClass.DoSomeThing();
10 }

以上的书写方式都是可以实现的,上两段代码同等于下面这段代码:


 1 StudyClass studyClass = new StudyClass();
2 try
3 {
4 studyClass.DoSomeThing();
5 }
6 finally
7 {
8 if (studyClass != null)
9 {
10 IDisposable dis = studyClass;
11 dis.Dispose();
12 }
13 }

本篇的内容没有很复杂深奥,只是基础的讲解了一下对象的生命周期管理,还有一些深入的知识就不作讲解了,还有的就是我们在面向对象设计的时候,准备对一些重要的使用率较高的对象面向抽象设计的时候,尽量的让抽象对象来实现IDisposable接口,这样的话也不会出现上述内容中的错误信息。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

时间: 2024-12-29 07:37:00

.Net组件程序设计之对象生命周期的相关文章

ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很长的路要走.今天,我们就研究一下在事件处理器中,对象生命周期的管理问题. 事实上,不仅仅是在事件处理器中,我们需要关心对象的生命周期,在整个ASP.NET Core Web API的应用程序里,我们需要理解并仔细推敲被注册到IoC容器中的服务,它们的生命周期应该是个怎样的情形,这也是服务端应用程序设

android开发3:四大基本组件的介绍与生命周期

android开发3:四大基本组件的介绍与生命周期 Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器,. 生命周期 是指进程周期 – 创建到结束的过程 进程类别 前台进程:当前正在前台运行的进程 可见进程:显示在前台中,但用户并未在和其进行交互 服务进程:为用户提供服务的进程 后台进程 空进程:该进程一般是为了缓存机制而存在的 组件介绍 Activity(表现层) 应用程序中,一个Act

React Native组件的结构和生命周期

React Native组件的结构和生命周期 一.组件的结构 1.导入引用 可以理解为C++编程中的头文件. 导入引用包括导入react native定义的组件.API,以及自定义的组件. 1.1 导入组件 1.2 导入API 1.3 导入自定义组件 2.组件的声明 组件的生命分为组件的定义和样式.组件的定义有各种组件的组成结构.方法的定义. 2.1 组件的定义 2.2 组件样式 组件样式的定义可以直接在组件的定义中的style中定义.但是对于样式复杂的组件需要组件样式. 3.组件的注册或导出

[翻译]理解C#对象生命周期

看到网上的一篇讲C#对象生命周期(Object Lifetime)的文章,通俗易懂,而且有图,很适合初学者学习,就翻译过来了.后来发现这是Pro C# 2010 and the .NET 4 Platform的第八章中的一部分.(感谢 大乖乖 提醒).文中的专业名词第一次出现时,括号里会标注对应的英文单词. 请尊重作者劳动,转载请注明出处:http://www.cnblogs.com/Jack47/archive/2012/11/14/2770748.html. ----2012年11月15日修

struts2.0中Action的对象生命周期详解!!(转)

原文出处:http://blog.csdn.net/wxy_g/article/details/2071662 有很多人问Struts2.0中的对象既然都是线程安全的,都不是单例模式,那么它究竟何时创建,何时销毁呢? 这个和struts2.0中的配置有关,我们来看struts.properties ### if specified, the default object factory can be overridden here ### Note: short-hand notation is

【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppe

iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewController对象的视图已经加入到窗口时调用: viewWillDisappear-UIViewCont

_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewController对象的视图已经加入到窗口时调用: viewWillDisappear-UIViewCont

IOS 视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewController对象的视图已经加入到窗口时调用: viewWillDisappear-UIViewCont

Ninject之旅之三:Ninject对象生命周期

摘要 DI容器的一个责任是管理他创建的对象的生命周期.他应该决定什么时候创建一个给定类型的对象,什么时候使用已经存在的对象.他还需要在对象不需要的时候处理对象.Ninject在不同的情况下管理对象的生命周期提供了强大的支持.在我们定义一个绑定的时候,定义创建对象的范围.在那个范围内,对象将被重用,每次绑定只存在一次.注意,对象不允许依赖于生命周期比自己小的对象. 1.暂时范围 在暂时态范围内,对象生命周期不被Ninject进行管理.任何时候请求一个类型的对象,都将创建一新对象.Ninject不管