WiresharkFile abstract
类:
public abstract class WiresharkFile
{
private PlayBehavior _playBehavior;
public void Transmit()
{
_playBehavior.Transmit();
}
public virtual void Dispose()
{
// Implemented inside inherit classes.
}
}
播放选项abstract
课程:
public abstract class PlayBehavior
{
public WiresharkFile wiresharkFile;
public abstract void Transmit();
}
播放选项儿子类:
public class Normal : PlayBehavior
{
public override void Transmit()
{
using (this.wiresharkFile)
{
}
}
}
所以我有这个派生类:
public class Libpcap : WiresharkFile, IDisposable, IEnumerable<Packet>
{
private BinaryReader binaryReader;
public void Dispose()
{
if (binaryReader != null)
binaryReader.Close();
}
...
// Severl methods
...
public override void SendPackets()
{
base.Transmit();
}
}
我的问题:
在调用Libpcap
时在此base.Transmit()
类中:在何处使用?
在这个Libpcap
类SendPackets()中:
public override void SendPackets()
{
using(this)
{
base.Transmit();
}
}
在Normal
班Transmit()
内:
public class Normal : PlayBehavior
{
public override void Transmit()
{
using (this.wiresharkFile)
{
}
}
}
答案 0 :(得分:3)
调用using(this)
永远不会有意义。这意味着你自己正在调用Dispose
,这意味着A)你的类将在using
块的末尾处于未定义状态,而B)代码调用你将看到你是IDisposable
并期望能够控制您的生命,但您实际上是在代码中自己控制它。
如果您的Libpcap
生命周期在发送呼叫后结束,您可以在using
类中使用PlayBehavior
- 它保留对它的引用,因此它控制其生命周期
实施IDisposable是合同。通过这样做,你说“我的操作保存了对非托管资源(文件,tcp连接等)的引用,而你,我的调用者,当你完成我发布时,你需要调用我的Dispose
方法他们”。如果这不是WiresharkFile期望的使用合同,不实现IDisposable。
如果你有非托管资源作为正常操作的一部分创建和发布,但不需要你的调用者明确释放,只需自己动手做 - 完成后,释放内部非托管资源。