C#对象生命周期(转载)
2010-05-22 17:17
316 查看
对象生命周期大致经历以下几个阶段
①程序集载入内存,类型装载
②调用new,或类成员(静态成员),触发类静态构造函数(若有)。
③调用new在进行完②之后,触发实例构造函数(若没有自己编写,编译器会创建public默认构造函数,若自己写,无论有参无参,编译器不再创建默认构造函数),
实例构造函数会首先调用父类默认实例构造函数,这是默认行为(生成IL代码时会显示调用),无需显示指定,只有在需要调用父类带参构造函数时,才需显示指定,如:base(x,y,z)。有意思的是,如果父类也有静态构造函数的话,会在此时调用父类静态构造函数。
也就是 : 子类静态构造函数→父类静态构造函数→父类实例构造函数→子类实例构造函数 的顺序。
④调用子类方法,或被作为参数传递,或作为成员构造更大类型,或作为元素转入容器类等。
⑤总之,若对象在应用程序的代码中可以访问该对象,对象就一直存在(活对象,强引用),否则就称为死对象,随时可以被GC回收。(可以对死对象创建弱引用,并且可以使之复活)
⑥在不确定时间点,GC对死对象回收内存。若对象存在Finalize方法,则会被调用(执行终止),若无,则直接被回收。
Finalize被调用的时候会依据继承层次形成调用队列,与构造函数相反,Finalize会先执行本地代码,在执行继承连上层的Finalize(并不保证每个层次都有Finalize方法,若某个层次没有,就调用更上一层的Finalize,最终调用Object.Finalize)。
①程序集载入内存,类型装载
②调用new,或类成员(静态成员),触发类静态构造函数(若有)。
③调用new在进行完②之后,触发实例构造函数(若没有自己编写,编译器会创建public默认构造函数,若自己写,无论有参无参,编译器不再创建默认构造函数),
实例构造函数会首先调用父类默认实例构造函数,这是默认行为(生成IL代码时会显示调用),无需显示指定,只有在需要调用父类带参构造函数时,才需显示指定,如:base(x,y,z)。有意思的是,如果父类也有静态构造函数的话,会在此时调用父类静态构造函数。
也就是 : 子类静态构造函数→父类静态构造函数→父类实例构造函数→子类实例构造函数 的顺序。
④调用子类方法,或被作为参数传递,或作为成员构造更大类型,或作为元素转入容器类等。
⑤总之,若对象在应用程序的代码中可以访问该对象,对象就一直存在(活对象,强引用),否则就称为死对象,随时可以被GC回收。(可以对死对象创建弱引用,并且可以使之复活)
⑥在不确定时间点,GC对死对象回收内存。若对象存在Finalize方法,则会被调用(执行终止),若无,则直接被回收。
Finalize被调用的时候会依据继承层次形成调用队列,与构造函数相反,Finalize会先执行本地代码,在执行继承连上层的Finalize(并不保证每个层次都有Finalize方法,若某个层次没有,就调用更上一层的Finalize,最终调用Object.Finalize)。
相关文章推荐
- (转载)理解C#对象生命周期
- C# 中反射获取某类的子类和根据类型名动态创建对象(转载)
- C#的新特性:自动属性,对象初始化器,和集合初始化器(转载)
- C#中的正则表达式对象[转载]
- [翻译]理解C#对象生命周期
- 【转载】实体框架之领域驱动实践(七):模型对象的生命周期 - 仓储
- C# 3.0 之 对象初始化器 (Object Initializers) (转载)
- C# json反序列化 对象中嵌套数组 (转载) 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
- [转载] C#异步编程模型1--使用 IAsyncResult 对象的异步设计模式
- [Json] C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json (转载)
- 遍历memcached缓存对象(C#)转载之青草堂
- 转载:对象生命周期 C++
- C#对象的浅拷贝,深拷贝【转载】
- C#中的正则表达式对象[转载]
- 转载C# 对象转Json序列化
- (原创)c#学习笔记08--面向对象编程简介01--面向对象编程的含义03--对象的生命周期--构造函数和析构函数
- C#释放COM对象引用的内存转载
- [转载]C#对象序列化与反序列化
- C# 中反射获取某类的子类和根据类型名动态创建对象(转载)
- C#利用反射动态创建对象 带参数的构造函数和String类型 (转载)