2

そのため、現在、フォームを閉じるときに多くのオブジェクトを破棄しています。おそらく自動的に破棄されますが。しかし、それでも私は処分する際の「ルール」に従うことを好みます。うまくいけば、それが固執し、間違いを防ぐのに役立ちます.

だから、これが私が現在どのように処分しているかです。

        if (connect == true)
        {
            Waloop.Dispose();
            connect = false;
            UninitializeCall();
            DropCall();

        }
        if (KeySend.Checked || KeyReceive.Checked)
        {
            m_mouseListener.Dispose();
            k_listener.Dispose();

        }
        if (NAudio.Wave.AsioOut.isSupported())
        {
            Aut.Dispose();
        }

        if (Wasout != null)
        {
            Wasout.Dispose();
        }
        if (SendStream != null)
        {
            SendStream.Dispose();
        }

基本的に、最初はブール値が true の場合です。つまり、そうでない場合は、作成されていないため無視できます。

他のものは、そこにある場合に私が処分する方法にすぎません。しかし、それはあまり良い方法ではありません.1つの大きな機能にまとめたいと思っています.

処分しない場合は処分します。か何か。それらの多くが「isdisposed」ブール値を持っていることを知っているので、すべてのオブジェクトをチェックして、それが false の場合は破棄できれば可能です。

4

4 に答える 4

5

IDisposableparamsとして実装するオブジェクトを取るヘルパーメソッドはどうですか?

void DisposeAll(params IDisposable[] disposables)
{
  foreach (IDisposable id in disposables)
  {
    if (id != null) id.Dispose();
  }
}

複数のオブジェクトを破棄する場合は、破棄するオブジェクトを指定してメソッドを呼び出します。

this.DisposeAll(Wasout, SendStream, m_mouseListener, k_listener);

それらを明示的に呼び出すことを避けたい場合は、それらをすべて a に保存しますList<>

private List<IDisposable> _disposables;

void DisposeAll() {
  foreach(IDisposable id in _disposables) {
    if(id != null) id.Dispose();
  }
}
于 2013-08-15T13:46:43.380 に答える
2

Disposer次の行に沿って、作業を行うクラスを実装できます。

public class Disposer
{
   private List<IDisposable> disposables = new List<IDisposable>();

   public void Register(IDisposable item)
   {
      disposables.Add(item);
   }

   public void Unregister(IDisposable item)
   {
      disposables.Remove(item);
   }

   public void DisposeAll()
   {
      foreach (IDisposable item in disposables)
      {
        item.Dispose();
      }
      disposables.Clear();
   }
}

次に、メイン クラスの醜いコードの代わりに、次のようなものを使用できます。

public class Main
{
   //member field
   private Disposer m_disposer;

   //constructor
   public Main()
   {
       ....
       m_disposer = new Disposer();
       //register any available disposables
       disposer.Register(m_mouseListener);
       disposer.Register(k_listener);
   }

   ...

   public bool Connect()
   {
       ...
       if (isConnected)
       {
           Waloop = ...
           Wasout = ...
           // register additional disposables as they are created
           disposer.Register(Waloop);
           disposer.Register(Wasout);
       }
   }

   ...

   public void Close()
   {
     //disposal
     disposer.DisposeAll();
   }
}
于 2013-08-15T14:07:20.473 に答える
1

using ステートメントを使用することをお勧めします。したがって、コードでは、次のようになります。

  using (WaloopClass Waloop = new WaloopClass())
  {
        // Some other code here I know nothing about.

        connect = false; // Testing the current value of connect is redundant.
        UninitializeCall();
        DropCall();
  }

Dispose Waloop は using ステートメントの最後で自動的に行われるため、明示的に Dispose する必要はありません。

これはコードの構造化に役立ち、Waloop の範囲がより明確になります。

于 2013-08-15T13:49:53.390 に答える
1

あなたが解決しようとしている唯一の問題は、以下をより良い方法で書く方法だと思います。

if (Wasout != null)
    Wasout.Dispose();
if (SendStream != null)
    SendStream.Dispose();

usingこれは、キーワードによってすでに実装されている多くのロジックです。呼び出す前にusing、変数が null でないことを確認しDispose()ます。また、usingスローされた例外 (おそらく によって) が、リストされている他のオブジェクト ( など) のWasout.Dispose()呼び出しの試行を中断しないことを保証します。スコーピング ルールに基づいてリソースを管理できるようにすることを意図していたようです。別の書き方として使用することは、言語の乱用と見なされる可能性があります。ただし、の動作とそれによって可能になる簡潔さの利点は非常に価値があります。したがって、「<code>if (o != null) o.Dispose()」のそのような大量の静的に書き込まれたバッチを「空」に置き換えることをお勧めします。Dispose()SendStreamusingusingo.Dispose()usingusing

using (
    IDisposable _Wasout = Wasout,
    _SendStream = SendStream)
{}

Dispose()呼び出される順序は、オブジェクトがusingブロックにリストされる方法とは逆になることに注意してください。これは、インスタンス化の順序とは逆にオブジェクトをクリーンアップするパターンに従います。(後でインスタンス化されたオブジェクトが、以前にインスタンス化されたオブジェクトを参照する可能性があるという考え方です。たとえば、はしごを使って家を登っている場合、はしごを片付けるに元に戻せるように、はしごを周りに置いておきたい場合があります—はしごが最初にインスタンス化され、最後にクリーンアップされます. うーん、類推... しかし、基本的に、上記はネストされた の省略形ですusing. そして、異なるオブジェクトは、 in の観点からusing書くことで同じブロックに粉砕できます.)usingIDisposable

例外を管理する dotnetfiddle using

于 2014-02-19T15:57:08.440 に答える