当我写邮件投递服务时,我找到'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)函数的作用是什么?
答案 0 :(得分:4)
您认为您发现的代码“调用垃圾收集来释放”底层资源是不正确的。
核心是,您的消息使用Stream
。 SuppressFinalize
不是您正在寻找的(如果您感兴趣,它只是为GC设置了一个标志,更详细解释here)。但是,您确实在寻找正在使用的流的Dispose
的实现。流允许您向/从某个源或目标读取或写入数据。
有许多种不同的Streams。所有流都包含某种资源,例如磁盘上的文件,网络,Web服务器,邮件服务器,打印机,内存或计算机必须提供的任何类型的数据资源。因此,Dispose
方法通常只是“关闭”资源(它关闭,例如,流关闭的文件或网络连接)。
大多数流通过放置system calls与负责maintaining your computer's resources的操作系统进行通信来打开/读取/写入/关闭底层资源。如果您对该课程的低级细节感兴趣,您可能需要阅读一本好书或在Operating Systems上参加在线课程。