如何在继承类中实现Dispose

时间:2016-07-28 09:57:19

标签: c# .net inheritance dispose

我在.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

是否有人能够指出我正确的方向?

1 个答案:

答案 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是你应该考虑的原则。