1

使い捨てオブジェクトを処理する方法が非常に効率的であるため、「Using」の使用について通知を受けました。その特定のコマンドでのみそれらを使用するため、削除されます。

しかし、あなたが常にそれを使用したいと思っていることがわかりませんし、それは常に効率的です。

だから私の質問はここにあります。これはそれを使用する良い方法ですか、それとも不必要ですか、それとも何らかの形で私のパフォーマンスを損なうことさえありますか?

       void Sending(object sender, NAudio.Wave.WaveInEventArgs e)
    {
        using (UdpClient udpclient = new UdpClient())
        {
       if (connect == true && MuteMic.Checked == false)
       {

               udpclient.Send(e.Buffer, e.BytesRecorded, otherPartyIP.Address.ToString(), 1500);

       }
       }
   }

これは NAudio からのイベントであり、WaveInEvent にデータがある間にこれを実行します。

WaveInEvent は入力デバイスからのものなので、それを使用して録音を開始すると (マイクの例)、データが利用可能になり (マイクのオーディオ)、そのデータを使ってやりたいことができます。この場合、UDP 経由で送信しています。

しかし、ご覧のとおり、ローカルの udpclient を使用しています。そこで使用する必要があるのか​​ 、それとも新しいものを作成するのではなく、常に再利用できるように以前に作成しておく必要があるのか​​ わかりません。

説明を台無しにしていないことを願っています。

4

2 に答える 2

4

これはそれを使用する良い方法ですか、それとも不必要ですか、それとも何らかの形で私のパフォーマンスを損なうことさえありますか?

オブジェクトが IDisposable を実装する場合は、常にこれを使用する必要があります。パフォーマンスに悪影響を与えることはありません。オブジェクトが適切に破棄されるようにするだけです。

using ステートメントを使用すると、オブジェクトのメソッドを呼び出しているときに例外が発生した場合でも、Disposeが確実に呼び出されます。オブジェクトを try ブロック内に配置してから、finally ブロック内で Dispose を呼び出すことによって、同じ結果を得ることができます。実際、これは using ステートメントがコンパイラによってどのように変換されるかです。あなたのコードは、コンパイラにとって多かれ少なかれこのように見えます。

{
  UdpClient udpclient = new UdpClient();
  try
  {
   if (connect == true && MuteMic.Checked == false)
   {

           udpclient.Send(e.Buffer, e.BytesRecorded, otherPartyIP.Address.ToString(), 1500);

   }
  }
  finally
  {
    if (udpclient!= null)
      ((IDisposable)udpclient).Dispose();
  }
}

使用の詳細については、こちらを参照してください。

于 2013-08-05T05:54:55.937 に答える
1

Microsoft が言うように、一般的には「原則として、IDisposable オブジェクトを使用する場合は、using ステートメントで宣言し、インスタンス化する必要があります」。using ステートメント (C# リファレンス) - MSDN - Microsoft . ただし、オブジェクトを使用するたびにインスタンス化して破棄するよりも、オブジェクトを非ローカル変数として定義し、必要なときにいつでもローカル コードで呼び出す方がよい場合もあります。あなたの場合、常にデータを送信したいのでUdpClient、オブジェクトのインスタンス化と廃棄を繰り返すと(usingステートメントによって行われます)、パフォーマンスが低下する可能性があります(あなたの言葉では、パフォーマンスが損なわれます:)); そのため、アプリケーションで非ローカル変数を定義し、必要なときにいつでも呼び出して、Dispose不要になったときに呼び出すことを好みます。

于 2013-08-05T06:14:18.540 に答える