[英]I need to dispose all the declared objects from a class. but i do not know how many objects from that class
[英]Dispose Class. Do I need it?
我有以下邮件类:
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
邮件包含文件列表,其中每个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
我在using
包装MailMessage
使用using
关键字时,需要实现IDisposable
。 资料来源: MSDN
using语句允许程序员指定使用资源的对象何时释放它们。 提供给using语句的对象必须实现IDisposable接口。 该接口提供Dispose方法,该方法应释放对象的资源。
要回答您的特定问题,我们需要查看更多代码。
如果您的MailMessage
类包含任何非托管资源或流,则绝对必须释放实现IDisposable
并从代码中调用Dispose()
方法的资源。
如果要将它们包装在using语句中,则该类需要实现IDisposable。 如果不这样做,它甚至不会编译。
如果未管理内存,则可能只需要释放内存即可,但是将内部托管引用设置为null应该可以满足您的需要。
要回答您的特定问题:
我认为您不需要,但这不会造成伤害,并且可以使GC清楚地知道,对对象的引用较少。 如果您有类似以下内容:
String name;
using(MailFile mf = ...) {
name = mf.Name;
}
// do something with name
您仍然持有对实际字符串的引用,因此不会得到GC。 MF应该,但是不能保证什么时候。
是的,但是只要在某个地方保留了对该对象的引用,它们就不会存在。 如果将其设置为null,而没有其他引用内存中的实际对象,则意味着GC最终将对其进行清理,但不能保证何时发生。
通常不需要,但是是个好主意。 只需使其实现IDisposable并在处理时将字段设置为null。
参见上一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.