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

  • .NET 垃圾回收

  • IDisposable()

  • Using语句

.NET 垃圾回收

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

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

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

IDisposable()

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

     public interface IMyinterface
{
void DoSomeThing();
}
public class StydyClass:IMyinterface,IDisposable
{
public void Dispose()
{
//释放资源
}
public void DoSomeThing()
{
//do something
}
}

看一下客户端调用代码:

 IMyinterface studyClass = new StudyClass();
studyClass.DoSomeThing(); IDisposable disposable = studyClass as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}

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

Using语句

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

 using (IMyinterface studyClass = new StudyClass())
{
studyClass.DoSomeThing();
}

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

 IMyinterface studyClass = new StudyClass();
using (studyClass as IDisposable)
{
studyClass.DoSomeThing();
} using (StudyClass studyClass = new StudyClass())
{
studyClass.DoSomeThing();
}

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

 StudyClass studyClass = new StudyClass();
try
{
studyClass.DoSomeThing();
}
finally
{
if (studyClass != null)
{
IDisposable dis = studyClass;
dis.Dispose();
}
}

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

作者:金源

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

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

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

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

    在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...

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

    android开发3:四大基本组件的介绍与生命周期 Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver ...

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

    React Native组件的结构和生命周期 一.组件的结构 1.导入引用 可以理解为C++编程中的头文件. 导入引用包括导入react native定义的组件.API,以及自定义的组件. 1.1 导 ...

  4. Hibernate的三种状态及对象生命周期

        理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...

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

    摘要 DI容器的一个责任是管理他创建的对象的生命周期.他应该决定什么时候创建一个给定类型的对象,什么时候使用已经存在的对象.他还需要在对象不需要的时候处理对象.Ninject在不同的情况下管理对象的生 ...

  6. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  7. iOS视图控制对象生命周期

    iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...

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

    iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...

  9. 【转】【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

    原文网址:http://blog.csdn.net/weasleyqi/article/details/8090373 iOS视图控制对象生命周期-init.viewDidLoad.viewWillA ...

随机推荐

  1. Python-函数的递归调用

    递归调用顾名思义即在函数内部调用函数(自己调用自己),通常用它来计算阶乘,累加等   注意: - 必须有最后的默认结果 if n ==0,(不能一直调用自己,如果没有可能会造成死循环) - 递归参数必 ...

  2. maven 速度快的镜像

    <mirrors> <mirror> <id>CN</id> <name>UK Central</name> <url&g ...

  3. LinkedList源码阅读笔记(基于JDK1.8)

    LinkedList是List接口的一个有序链表实现,存储节点是内部类Node,Node中有两个属性prev和next,负责连接前后两个元素.由于不是使用数组进行存储,所以查询需要遍历链表一半的元素( ...

  4. CommonJS, AMD 和 RequireJS之间的关系(转载)

    先说说CommonJS CommonJS - 大家是不是觉得JavaScript仅仅是一个客户端的编译语言,其实JavaScript设计之初不仅仅是针对客户端设计的语言.后来只是由于Web的迅速流行, ...

  5. Domino----The Address Book does not contain a cross certificate capable of validating the public key.

    The Address Book does not contain a cross certificate capable of validating the public key. 地址本不包含交叉 ...

  6. 【虚拟机】在VMware中安装Server2008之后配置网络连接的几种方式

    VMware虚拟机的网络连接方式分为三种:桥接模式.NAT模式.仅主机(Host Only) (1)桥接模式 桥接模式即在虚拟机中虚拟一块网卡,这样主机和虚拟机在一个网段中就被看作是两个独立的IP地址 ...

  7. Apache Permission denied (httpd.conf配置和目录权限无问题)解决办法

    今天在CentOS5.9中配置zabbix时出现错误:Apache 403 error, (13)Permission denied: access to / denied 检查了一圈httpd.co ...

  8. 【BZOJ3940】【BZOJ3942】[Usaco2015 Feb]Censoring AC自动机/KMP/hash+栈

    [BZOJ3942][Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hoov ...

  9. 【转】《从入门到精通云服务器》第七讲—IAAS、PAAS、SAAS

    Saas.Paas.IaaS这三个词,一直困扰众人很久.就拿字面意思来说,分别是:软件即服务,平台即服务,设施即服务.小编表示这个不往深了讲,真心看不懂,还容易弄混淆.今天我们就来扒一扒这三者的深层含 ...

  10. 将excel数据读入matlab

    1.[NUM,TXT,RAW]=xlsread('example'),其中example是你的excel名,假设所有的数据都在example.xls中. 2.NUM返回的是excel中的数据,TXT输 ...