【问题标题】:repeatedly using a Local Variable with `using` statement vs. repeatedly calling a Non-Local Variable ?反复使用带有`using`语句的局部变量与反复调用非局部变量?
【发布时间】:2013-08-05 05:50:20
【问题描述】:

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

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

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

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

希望我没有把我的解释搞砸。

【问题讨论】:

  • “我看不到你总是想使用它”——当使用任何实现IDisposable的东西时,你总是想使用@987654323 @.

标签: c# local using naudio


【解决方案1】:

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

当任何对象实现 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();
  }
}

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

【讨论】:

  • 太棒了,这一切都清楚了。在大多数情况下,当涉及到这样的事情时,会有一把“双刃剑”。
  • @user2587718 很高兴它清除了您的想法。您可以将其标记为答案。
  • 会的,不过需要等待,计时器。但我想知道一件事。你真的可以 Dispose 一个 udpclient 吗?我只看到关闭,我猜这是类似的东西,但我猜它只会关闭监听并不会删除实际的客户端。
  • @user2587718 你可以在这里获得完整的细节msdn.microsoft.com/en-us/library/…
  • 我读过,但不明白。如果我需要处理一个 udpclient,你展示的那个方法似乎不起作用。
【解决方案2】:

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

【讨论】:

  • 是的,我认为对于这个例子来说这是一个更好的方法,因为事件每秒会触发多次。最好保持单个 UdpClient 实例处于打开状态,并在录制完成后将其丢弃
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
相关资源
最近更新 更多