【问题标题】:What does the Dispose method do in C#? [duplicate]Dispose 方法在 C# 中的作用是什么? [复制]
【发布时间】:2013-12-21 22:49:18
【问题描述】:

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

【问题讨论】:

  • 仅供参考,Dispose 不是 C# 的一部分。它是 .NET 的一部分,这不是一回事。
  • 我投票决定保持开放,因为这不像链接副本那样是设计模式问题。
  • 太棒了。找出与此重复的其他 999 个问题之一。

标签: c# .net


【解决方案1】:

您认为您找到的代码“调用垃圾收集以释放”基础资源的假设不正确。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多