2016-07-28 11 views
0

私は(それがIDisposableを実装していないという意味)。NET-3.5フレームワークでSmtpClientを使用していますが、そうのような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); 
    } 
} 

メッセージを送信するための細かい動作しますが、デバッグするとき、それは(this.Dispsoe();だけで永遠に自分自身を呼び出すように)StackOverflow例外がスローされます。

他の多くの質問によれば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

なぜこれをやろうとしていますか?実際には何も処理していないので、どうして気になるのですか? – Maarten

+0

@Maarten 'SmtpClient'の後の実装で' IDisposable'が実装されているので、 'Send'を呼び出した後にまだ残っているリソースがあると思いますか? – Bassie

+1

しかし、空のDisposeメソッドを追加しても何もしません。あなたは何かをきれいにするために何かを実際に行う必要があります。 – Maarten

答えて

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は本当に考慮する必要がある原則です。

+0

ありがとうございます。 'SmtpClient.Dispose()'がフレームワークのそれ以降のバージョンで実際に何をしているのか知っていますか? – Bassie

+1

それは、それ以降のバージョンでは、新しいSmtpClient実装で使用されるリソースを破棄します。つまり、.Net 4を対象とするときにこのコードを確認する必要があります。または、ソリューション2のDispose実装で条件付きコンパイルを使用できます。 #if Net40の条件で実装をラップします。しかし、それは単純ではないし、別のフレームワークバージョンの同時ターゲティングを必要としない場合、私は気にしません。 –

関連する問題