C#中的Dispose方法是什么?

3
当我编写邮件投递服务时,我发现了“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) 函数有什么作用?


FYI,“Dispose”不是C#的一部分,它是.NET的一部分,而这两者并不相同。 - John Saunders
我投票支持保持开放,因为这不是像链接的重复问题那样的设计模式问题。 - Gustav Bertram
很好。找到另外999个问题中的一个,这是一个重复的。 - John Saunders
1个回答

5
您认为找到的代码“调用垃圾回收来释放”底层资源的假设是不正确的。在核心中,您的消息使用了一个Stream。如果您感兴趣,SuppressFinalize不是您要找的内容,它只是为GC设置了一个标志,更多细节解释请参见这里。但是,您真正需要的是正在使用的流的Dispose实现。流允许您从某些源或目标读取或写入数据。有许多不同类型的流。流所做的只是包装某种资源,例如磁盘上的文件、网络上的文件、Web服务器上的文件、邮件服务器上的文件、打印机上的文件、内存中的文件或计算机提供的几乎任何类型的数据资源。因此,Dispose方法通常只是“关闭”资源(例如,关闭流使用的文件或网络连接)。
大多数流通过使用系统调用与操作系统通信来打开/读取/写入/关闭底层资源,操作系统是负责维护计算机资源的人。如果您对此感兴趣,可以阅读一本好书或参加操作系统的在线课程了解低级细节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接