任何意味着在哪里找到使用?

时间:2015-11-30 12:18:39

标签: c# using binaryreader

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

NormalTransmit()内:

public class Normal : PlayBehavior
{
    public override void Transmit()
    {
        using (this.wiresharkFile)
        {

        }
    }
}

1 个答案:

答案 0 :(得分:3)

调用using(this)永远不会有意义。这意味着你自己正在调用Dispose,这意味着A)你的类将在using块的末尾处于未定义状态,而B)代码调用你将看到你是IDisposable并期望能够控制您的生命,但您实际上是在代码中自己控制它。

如果您的Libpcap生命周期在发送呼叫后结束,您可以在using类中使用PlayBehavior - 它保留对它的引用,因此它控制其生命周期

实施IDisposable是合同。通过这样做,你说“我的操作保存了对非托管资源(文件,tcp连接等)的引用,而你,我的调用者,当你完成我发布时,你需要调用我的Dispose方法他们”。如果这不是WiresharkFile期望的使用合同,实现IDisposable。

如果你有非托管资源作为正常操作的一部分创建和发布,但不需要你的调用者明确释放,只需自己动手做 - 完成后,释放内部非托管资源。