我有以下邮件类:
public class Mail {
public List<MailFile> Files { get; set; }
public String Text { get; set; }
// Other properties
}
public class MailFile {
public Byte[] Data { get; set; }
public String Mime { get; set; }
public String Name { get; set; }
} // MailFile
Mail包含一个文件列表,其中每个MailFile包含一个属性Data,其中包含File二进制数据。然后我使用Mailer发送电子邮件。
public class Mailer : IMailer {
private SmtpClient _client;
public Mailer() {
_client = new SmtpClient { UseDefaultCredentials = true };
} // Mailer
public void Send(Mail mail) {
using (MailMessage message = new MailMessage()) {
message.Text = mail.Text);
// Define other fields
foreach (MailFile file in mail.Files)
message.Attachments.Add(new Attachment(new MemoryStream(x.Data), x.Name, x.Mime)));
_client.Send(message);
};
} // Send
public void Dispose() {
Dispose(true);
} // Dispose
protected virtual void Dispose(Boolean disposing) {
if (disposing) {
if (_client != null)
_client.Dispose();
}
} // Dispose
} // Mailer
我将MailMessage包装在using
答案 0 :(得分:1)
使用IDisposable
关键字时,您需要实施using
。资料来源:MSDN
using语句允许程序员指定对象的时间 使用资源应该释放它们。提供给使用的对象 语句必须实现IDisposable接口。这个界面 提供Dispose方法,该方法应该释放对象 资源。
要回答您的具体问题,我们需要查看更多代码。
如果您的MailMessage
类包含任何非托管资源或流,您肯定必须释放实施IDisposable
并从代码中调用Dispose()
方法的资源。
答案 1 :(得分:0)
如果您要将它们包装在using语句中,则该类需要实现IDisposable。如果你不这样做,它甚至都不会编译。
如果没有管理内存,你可能只需要释放内存,但将内部托管引用设置为null应该涵盖你需要的内容。
回答您的具体问题:
我认为你不需要,但它不会受到伤害,并且会向GC明确表示对这些对象的引用较少。如果你有类似的东西:
String name;
using(MailFile mf = ...) {
name = mf.Name;
}
// do something with name
你仍然持有对实际字符串的引用,因此它不会得到GC。 mf应该,但不能保证什么时候。
是的,但只要在某处保留对象的引用,它们就不会存在。将其设置为null,其他任何内容都没有引用内存中的实际对象意味着GC最终将清理它,但不能保证何时会发生。
不是必需的,但通常是一个好主意。只需让它实现IDisposable并在处理时将字段设置为null。
见上一点。