1

我刚刚收到关于使用“使用”的通知,因为它在处理一次性物品方面非常有效。由于它只会在该特定命令中使用它们,因此它将被删除。

但我不知道限制在哪里,因为我看不出你总是想使用它,而且它总是有效的。

所以我的问题是。这是使用它的好方法,还是没有必要,甚至会以任何方式损害我的表现?

       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

正如微软所说,通常“作为一项规则,当您使用 IDisposable 对象时,您应该在 using 语句中声明并实例化它。” using 语句(C# 参考) - MSDN - Microsoft . 但有时,将对象定义为非局部变量并在需要时在本地代码中调用它而不是在每次要使用它时实例化对象然后释放它是一个更好的主意。在您的情况下,因为您想不断发送数据UdpClient,重复实例化和处置对象(由using语句完成),可能会降低性能(用您的话来说会损害您的性能:));所以我更喜欢在我的应用程序中定义一个非局部变量,在我需要时调用它,然后Dispose在不再需要时调用它。

于 2013-08-05T06:14:18.540 回答