Dispose方法在C#中做了什么?

时间:2013-12-05 05:53:27

标签: c# .net

当我写邮件投递服务时,我找到'Dispose()'函数:

private void InnerDisposeMessage(MailMessage message)
        {
            if (message != null)
            {
                if (message.AlternateViews.Count > 0)
                {
                    message.AlternateViews.Dispose();
                }

                message.Dispose();
                message = null;
            }
        }

我跟踪Dispose()函数(message.AlternateViews.Dispose();),这里是:

 public void Dispose()
        {
            if (!this.disposed)
            {
                foreach (AlternateView view in this)
                {
                    view.Dispose();
                }
                base.Clear();
                this.disposed = true;
            }
        }

我跟踪view.Dispose()函数,这里是:

protected virtual void Dispose(bool disposing)
        {
            if (disposing && !this.disposed)
            {
                this.disposed = true;
                this.part.Dispose();
            }
        }

我跟踪this.part.Dispose();功能,这里是:

 public void Dispose()
        {
            if (this.stream != null)
            {
                this.stream.Close();
            }
        }

我跟踪流:

public virtual void Close()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }

和SuppressFinalize:

public static void SuppressFinalize(object obj)
        {
            if (obj == null)
            {
                throw new ArgumentNullException("obj");
            }
            _SuppressFinalize(obj);
        }

但是如何释放资源?我只是理解调用垃圾收集来释放,但是如何?

我知道这个问题不容易理解,但我只是想试试!

GC.SuppressFinalize(this)函数的作用是什么?

1 个答案:

答案 0 :(得分:4)

您认为您发现的代码“调用垃圾收集来释放”底层资源是不正确的。

核心是,您的消息使用StreamSuppressFinalize不是您正在寻找的(如果您感兴趣,它只是为GC设置了一个标志,更详细解释here)。但是,您确实在寻找正在使用的流的Dispose的实现。流允许您向/从某个源或目标读取或写入数据。

有许多种不同的Streams。所有流都包含某种资源,例如磁盘上的文件,网络,Web服务器,邮件服务器,打印机,内存或计算机必须提供的任何类型的数据资源。因此,Dispose方法通常只是“关闭”资源(它关闭,例如,流关闭的文件或网络连接)。

大多数流通过放置system calls与负责maintaining your computer's resources的操作系统进行通信来打开/读取/写入/关闭底层资源。如果您对该课程的低级细节感兴趣,您可能需要阅读一本好书或在Operating Systems上参加在线课程。