重复使用带有`using`语句的局部变量与重复调用非局部变量?

时间:2013-08-05 05:50:20

标签: c# local using naudio

我注意到使用“使用”,因为它在处理一次性物体方面非常有效。由于它只会在某个命令中使用它们,因此它将被删除。

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

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

       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。 我不知道我是否应该在那里使用它,或者如果我之前应该创建一个,那么它可以一直重复使用它,而不是创建一个新的。

希望我没有把我的解释弄得一团糟。

2 个答案:

答案 0 :(得分:4)

  

这是一种使用它的好方法,还是不必要,或者甚至会以任何方式损害我的表现?

当任何对象实现IDisposable时,您应该始终使用它。它对性能没有任何负面影响。它所要做的就是确保妥善处置对象。

using语句确保即使在对象上调用方法时发生异常,也会调用 Dispose 。您可以通过将对象放在try块中然后在finally块中调用Dispose来实现相同的结果;实际上,这就是编译器如何翻译using语句。对于compliler,您的代码或多或少会像这样。

{
  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();
  }
}

您可以阅读使用here的详细信息。

答案 1 :(得分:1)

正如微软所说,“通常情况下,当您使用IDisposable对象时,您应该在using语句中声明并实例化它。”using Statement (C# Reference) - MSDN - Microsoft。但有时,最好将对象定义为非局部变量,并在需要时在本地代码中调用它,而不是每次要使用它时实例化对象然后处理它。在您的情况下,因为您希望不断地使用UdpClient发送数据,反复实例化和处理对象(由using语句完成),可能会降低性能(用你的话来伤害你的表现:));所以我更喜欢在我的应用程序中定义一个非局部变量,随时调用它,然后在不再需要时调用{<1}}。