我在.NET-3.5框架中使用SmtpClient
(意味着它没有实现IDisposable
),但是想把它放在一个像这样的using语句中:
using (var client = new DisposableSmtpClient("mail.domain.com", 25)
{ Credentials = new NetworkCredential(), EnableSsl = false })
{
client.Send(EmailAddress,
EmailAddress,
Subject,
body);
}
所以我创建了以下内容:
class DisposableSmtpClient : SmtpClient, IDisposable
{
bool disposed;
public DisposableSmtpClient(string mailServer, int port) : base(mailServer, port)
{
// var client = new SmtpClient(mailServer, port);
}
public void Dispose()
{
this.Dispose();
GC.SuppressFinalize(this);
}
}
哪个适用于发送消息,但在调试时会引发StackOverflow
异常(因为this.Dispsoe();
将永远调用自身)。
我尝试按照许多其他SO问题调用this.Dispose(true)
,但这会抱怨No overload for method 'Dispose' takes 1 arguments
。
base.Dispoe()
也可以,因为'SmtpClient' does not conatin a definition for 'Dispose'
最后,我还尝试了签名protected override void Dispose(bool disposing)
,但我得到Dispose(): no suitable method found to override
是否有人能够指出我正确的方向?
答案 0 :(得分:1)
1 - 您无需处置任何内容,因此您不需要Dispose
。
刚刚换新:
var client = new SmtpClient("mail.domain.com", 25)
{ Credentials = new NetworkCredential(), EnableSsl = false };
client.Send(EmailAddress,
EmailAddress,
Subject,
body);
2 - 如果确实想要使用using
(我不知道你为什么要这样做),你必须实施一个空的处理(因为你没有任何东西)处置开始):
class DisposableSmtpClient : SmtpClient, IDisposable
{
public DisposableSmtpClient(string mailServer, int port) : base(mailServer, port)
{
}
public void Dispose()
{
// anything to do, so don't do anything.
}
}
IMO,KISS是你应该考虑的原则。