博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net组件程序设计之对象生命周期
阅读量:6910 次
发布时间:2019-06-27

本文共 2227 字,大约阅读时间需要 7 分钟。

.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 something14         }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接口,这样的话也不会出现上述内容中的错误信息。

 

 

作者:

出处:

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

转载于:https://www.cnblogs.com/jin-yuan/p/3740256.html

你可能感兴趣的文章
php测试kafka
查看>>
js获取两个日期之间时间差(天数)
查看>>
Memcached 简介
查看>>
虚拟化二、Xen虚拟化技术
查看>>
Oracle 11g数据库随系统自动启动与关闭的设置方法
查看>>
天猫与九大快递合作 价格热战之后的冷静竞争
查看>>
git pull force
查看>>
scons用户手册
查看>>
使用new操作符来调用一个构造函数的时候发生了什么
查看>>
element-ui之el-scrollbar源码解析学习
查看>>
ceph 的pg诊断
查看>>
交换机配置vlan 访问控制列表
查看>>
我的友情链接
查看>>
12个时间管理妙招
查看>>
Python面向对象之类的成员
查看>>
Win8上iis配置
查看>>
Confluence 6 配置 Office 转换器
查看>>
IT从业人员关注哪些问题
查看>>
Windows 2012 Hyper –V 3.0 New Functions
查看>>
maven部分插件配置demo
查看>>