我注意到使用“使用”,因为它在处理一次性物体方面非常有效。由于它只会在某个命令中使用它们,因此它将被删除。
但是我不知道限制在哪里,因为我看不到你总是想要使用它,而且总是有效率。
所以我的问题是。这是一种使用它的好方法,还是不必要,或者甚至会以任何方式损害我的表现?
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。 我不知道我是否应该在那里使用它,或者如果我之前应该创建一个,那么它可以一直重复使用它,而不是创建一个新的。
希望我没有把我的解释弄得一团糟。
答案 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}}。