何时使用Dispose或何时使用Using

时间:2014-03-28 01:51:30

标签: c# asp.net dispose using handles

我最近遇到过Dispose方法必须在C#程序中进行硬编码的情况。否则,电子邮件中使用的文件将永远是"永远"锁定,甚至没有流程管理器能够告诉我谁/什么锁定它。我不得不使用 Unlocker Assistant 强制删除文件,但我担心现在我已经在服务器上留下了一些已分配的内存块。

我所指的代码是:

MailMessage mail = new MailMessage();
mail.From = new MailAddress("reception@domain.com", "###");
mail.Subject = "Workplace Feedback Form";
Attachment file = new Attachment(uniqueFileName);
mail.Attachments.Add(file);
mail.IsBodyHtml = true;
mail.CC.Add("somebody@domain.com");
mail.Body = "Please open the attached Workplace Feedback form....";

//send it
SendMail(mail, fldEmail.ToString());

上面的代码使文件从uniqueFileName被Attachment句柄锁定,我无法将其删除,因为此代码是从客户端计算机(而不是从服务器本身)运行的,该文件的句柄是不可能找到的。

在我强制删除文件之后,我在另一个论坛上发现我应该有一个Disposed of Attachment对象。

所以我在发送电子邮件后添加了这些代码行......

//dispose of the attachment handle to the file for emailing, 
//otherwise it won't allow the next line to work.
file.Dispose(); 

mail.Dispose(); //dispose of the email object itself, but not necessary really
File.Delete(uniqueFileName);  //delete the file 

我应该用using语句将其包裹起来吗?

这就是我的问题的症结所在。我们何时应该使用Using以及何时应该使用Dispose?我希望两者之间有一个明显的区别,即如果你这样做,那就是" X"然后使用它,否则使用它。

这个When to Dispose?C# Dispose : when dispose and who dispose it确实在某种程度上回答了我的问题,但我仍然对这些问题感到困惑"什么时候使用。

2 个答案:

答案 0 :(得分:6)

C#中的

using

using(MyDisposableType obj = new MyDisposableType())
{
  ...
}

是"语法糖" (或简写符号)等同于

MyDisposableType obj = new MyDisposableType();
try {
  ...
} finally {
  obj.Dispose();
}

http://msdn.microsoft.com/en-us//library/yh598w02.aspx

中所述

答案 1 :(得分:4)

  

我应该将它包装在using语句中吗?

要么将主要代码放在try块中,要将Dispose放在finally块中。

using只需用较少的代码安全地实现Dispose模式。 using会将Dispose放在finally块中,以便即使抛出异常也会处置该对象。现在的方式,如果抛出异常,对象将不会被处理,而是在收集垃圾时清理。

我从未遇到过无法使用using并且必须手动使用try / {{1}的情况与finally

所以选择权归您所有 - 您可以在Dispose()块中使用Dispose,这可能与您使用finally的情况相同。