C# 自动释放managed resource
来源:互联网 发布:马岛战争 知乎 编辑:程序博客网 时间:2024/05/17 20:33
近来正在研究垃圾收集器,finalizer 和 Dispose 。对某些managed resource的自动释放原理没有搞懂,对managed resource 的定义也不清楚,被微软 的Dispose 建议高糊涂了。请见源码,希望高手指点。
当程序运行时,a.txt是不能被wordPad打开,原因是已被另外一个程序打开,(上述代码以写的方式占有a.txt)。当程序结束时,a.txt能被wordPad打开,我认为CLR自动把managed resource (writer)关闭(close). 设置断点于dispose()中,但是程序从未停在断点处,说明dispose 没有被调用,
那么,什么时候writer被关闭?
我们知道finalizer 在对象被收集前会被自动调用,可是无论类A和B都没有finalizer。StreamWriter 我检查了一下,也没有finalizer 或 destrcutor。
望高手指教!
关于Finalizer 调用 Dispose(false)?
见以下代码,摘自msdn,插入writer作为managed object 例子
我没有找到一个很好的 managed object or resourse 的定义,我认为是所有实施IDisposable的类的变量,
可能应是所有带有destructor或finalizer的类的变量。
如果managed object or resourse 是所有实施IDisposable的类的变量,那么finalizer(~Base())在这怪怪的,因为他并没有释放writer 或关闭writer
我觉得finalizer的主要作用是释放 程序员忘记释放的资源,不仅仅是为托管的资源,
因为我们日常编程中涉及大部分是象StreamWriter那样的受托管的资源。
也有可能我了解错了,managed object 应该是带有destructor或finalizer的类的变量。但是StreamWriter并没有
也没有finalizer 或 destrcutor。
那位高手能捐出一段有streamWriter 和 finalizer 的代码!
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
namespace TestDisposeNotCalled {
static class Program {
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
B b = new B();
}
// b.a.writer is automatically closed?
}
public class A : IDisposable {
private StreamWriter writer=null;
IDisposable Members
public A() {
writer=new StreamWriter("a.txt",false);
writer.AutoFlush = true;
writer.Write("In A constructor!");
}
}
public class B {
private A a = new A();
}
}
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
namespace TestDisposeNotCalled {
static class Program {
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
B b = new B();
}
// b.a.writer is automatically closed?
}
public class A : IDisposable {
private StreamWriter writer=null;
IDisposable Members
public A() {
writer=new StreamWriter("a.txt",false);
writer.AutoFlush = true;
writer.Write("In A constructor!");
}
}
public class B {
private A a = new A();
}
}
当程序运行时,a.txt是不能被wordPad打开,原因是已被另外一个程序打开,(上述代码以写的方式占有a.txt)。当程序结束时,a.txt能被wordPad打开,我认为CLR自动把managed resource (writer)关闭(close). 设置断点于dispose()中,但是程序从未停在断点处,说明dispose 没有被调用,
那么,什么时候writer被关闭?
我们知道finalizer 在对象被收集前会被自动调用,可是无论类A和B都没有finalizer。StreamWriter 我检查了一下,也没有finalizer 或 destrcutor。
望高手指教!
关于Finalizer 调用 Dispose(false)?
见以下代码,摘自msdn,插入writer作为managed object 例子
// Design pattern for a base class.
public class Base: IDisposable
{
private StreamWriter writer=null;
//Implement IDisposable.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Free other state (managed objects).
if(writer !=null)
writer.Close();
}
// Free your own state (unmanaged objects).
// Set large fields to null.
}
// Use C# destructor syntax for finalization code.
~Base()
{
// Simply call Dispose(false).
Dispose (false);
}
}
public class Base: IDisposable
{
private StreamWriter writer=null;
//Implement IDisposable.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Free other state (managed objects).
if(writer !=null)
writer.Close();
}
// Free your own state (unmanaged objects).
// Set large fields to null.
}
// Use C# destructor syntax for finalization code.
~Base()
{
// Simply call Dispose(false).
Dispose (false);
}
}
我没有找到一个很好的 managed object or resourse 的定义,我认为是所有实施IDisposable的类的变量,
可能应是所有带有destructor或finalizer的类的变量。
如果managed object or resourse 是所有实施IDisposable的类的变量,那么finalizer(~Base())在这怪怪的,因为他并没有释放writer 或关闭writer
我觉得finalizer的主要作用是释放 程序员忘记释放的资源,不仅仅是为托管的资源,
因为我们日常编程中涉及大部分是象StreamWriter那样的受托管的资源。
也有可能我了解错了,managed object 应该是带有destructor或finalizer的类的变量。但是StreamWriter并没有
也没有finalizer 或 destrcutor。
那位高手能捐出一段有streamWriter 和 finalizer 的代码!
- C# 自动释放managed resource
- C# Managed DirectX 背面剔除
- 组件自动绑定到Managed Bean功能
- NSAutoreleasePool自动释放池
- IOS自动释放池
- iOS:自动释放问题?
- IOS自动释放池
- 自动释放池NSAutoReleasePool
- 自动释放池autoreleasepool
- 自动释放池
- 自动释放池,
- 自动释放池 (autoReleasePool)
- 自动释放池
- iOS---自动释放池
- 自动释放池
- 自动释放池
- 自动释放池autoreleasepool
- 自动释放池
- 企业即时通讯系统开发
- javascript与xml实现web分页
- [分享]一个在线网页缩略图服务(中国聚客网www.crossgo.com)
- Java多线程设计模式学习笔记 - Java内存模型
- 一首让陈天桥潸然泪下再捐600万的诗
- C# 自动释放managed resource
- C#压缩解压缩
- 高清晰视频企业即时通讯
- 地震来了....险!险!险!
- js挂马解决(担心会把js放在头部)
- 如何将网站变成灰色?
- IP网和电话网融合之号码机制
- 企业级的即时通讯
- 利用Web Service实现短信发送