Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dispose方法在C#中做什么?_C#_.net - Fatal编程技术网

Dispose方法在C#中做什么?

Dispose方法在C#中做什么?,c#,.net,C#,.net,当我编写邮件传递服务时,我发现“Dispose()”函数: private void InnerDisposeMessage(MailMessage message) { if (message != null) { if (message.AlternateViews.Count > 0) { message.Altern

当我编写邮件传递服务时,我发现“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;
            }
        }
protected virtual void Dispose(bool disposing)
        {
            if (disposing && !this.disposed)
            {
                this.disposed = true;
                this.part.Dispose();
            }
        }
 public void Dispose()
        {
            if (this.stream != null)
            {
                this.stream.Close();
            }
        }
我跟踪到view.Dispose()函数,如下所示:

 public void Dispose()
        {
            if (!this.disposed)
            {
                foreach (AlternateView view in this)
                {
                    view.Dispose();
                }
                base.Clear();
                this.disposed = true;
            }
        }
protected virtual void Dispose(bool disposing)
        {
            if (disposing && !this.disposed)
            {
                this.disposed = true;
                this.part.Dispose();
            }
        }
 public void Dispose()
        {
            if (this.stream != null)
            {
                this.stream.Close();
            }
        }
然后我跟踪到this.part.Dispose();函数,如下所示:

 public void Dispose()
        {
            if (!this.disposed)
            {
                foreach (AlternateView view in this)
                {
                    view.Dispose();
                }
                base.Clear();
                this.disposed = true;
            }
        }
protected virtual void Dispose(bool disposing)
        {
            if (disposing && !this.disposed)
            {
                this.disposed = true;
                this.part.Dispose();
            }
        }
 public void Dispose()
        {
            if (this.stream != null)
            {
                this.stream.Close();
            }
        }
我追踪着溪流:

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

public static void SuppressFinalize(object obj)
        {
            if (obj == null)
            {
                throw new ArgumentNullException("obj");
            }
            _SuppressFinalize(obj);
        }
但是如何释放资源呢?我只是理解调用垃圾收集来释放,但是如何释放呢

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


GC.SuppressFinalize(this)函数做什么?

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

在核心部分,您的消息使用了一个
SuppressFinalize
不是您想要的(如果您感兴趣,它只是为GC设置了一个标志,并解释了更多细节)。但是,您实际上是在寻找正在使用的流的
Dispose
的实现。流允许您向某个源或目标读取或写入数据

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


大多数流通过放置与负责的操作系统通信来打开/读取/写入/关闭底层资源。如果你对这方面的低级细节感兴趣,你可能想读一本好书或上一门在线课程。

FYI,
Dispose
不是C#的一部分。它是.NET的一部分,这是不一样的。我投票决定不公开,因为这不是一个设计模式问题,就像链接复制一样。太好了。查找其他999个问题中的一个,这是的副本。