我使用了一个dll而我没有它的源代码。有人建议我像这样使用这个dll的功能:
void IDSCallback.Received(NetworkStream a)
{
using (a)
{
// Some code...
}
}
我不明白using
的目的。在此函数结束时,会调用a.Dispose()
,因此a
不再可用。
因此调用IDSCallback.Received()
的函数不能再使用它了。
为什么using
位于函数IDSCallback.Received()
中,而不是调用IDSCallback.Received()
的函数?
答案 0 :(得分:1)
它类似于javas auto resource closing try-catch。看看documentation
在您的上下文中,您不应该处置参数。您应该在创建它的地方执行此操作:
void IDSCallback.Received(NetworkStream a)
{
//..
}
以及您创建它的位置:
using (NetworkStream a = /* Create the stream */)
{
IDSCallback.Received(a);
// Do whatever else you want with it
}
答案 1 :(得分:1)
using是一个try / finally块,以确保在资源上调用Dispose()
方法。有关编译器如何解释它,请参见MSDN documentation。
是否需要在using
方法中使用IDSCallback.Received
语句的问题取决于方法与调用代码的契约,除非有令人信服的理由,否则不应该处置它没有构建的资源。因此,也不应该有using
语句。
建议可能是调用IDSCallback.Received
方法使用using
语句的代码,因此一旦不再需要NetworkStream
,就可以将其正确处理掉。