如何在继承中实现 Dispose Class

How to Implement Dispose In Inheriting Class

我在 .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);
    }
}

这对于发送消息来说工作正常,但在调试时,它会抛出一个 Whosebug 异常(因为 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 - 你不需要处理任何东西,所以你不需要 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 是你真正应该考虑的原则。