【问题标题】:Any meant where to locate the using? [closed]任何意味着在哪里找到使用? [关闭]
【发布时间】:2015-11-30 12:18:39
【问题描述】:

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():在哪里使用 using ? 在这个 Libpcap 类 SendPackets() 内部:

public override void SendPackets()
{
   using(this)
   {
      base.Transmit();
   }
}

或者在NormalTransmit()里面:

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

        }
    }
}

【问题讨论】:

  • 请阅读有关 using 关键字以及何时使用它的文献。您将它用于实现 IDisposable 接口的对象。
  • 我的对象实现了 IDisposable。

标签: c# using binaryreader


【解决方案1】:

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

如果您的 Libpcap 的生命周期在 Transmit 调用之后结束,您可以在 PlayBehavior 类中使用 using - 它持有对它的引用,因此它控制其生命周期。

实现 IDisposable 是一个合同。通过这样做,您是在说“我的操作包含对非托管资源(文件、tcp 连接等)的引用,而您,我的调用者,需要在我完成释放它们时调用我的 Dispose 方法” .如果这不是 WiresharkFile 期望的使用合同,不要实现 IDisposable。

如果您有作为正常操作的一部分创建和释放的非托管资源,但不需要您的调用者显式释放,只需自己做- 完成后释放一个 internal 非托管资源。

【讨论】:

  • 我在 WiresharkFile 上实现 IDisposable,请参阅我的更新。
  • 顺便说一句,在这个 Transmit 调用之后,我的对象仍在列表中以供将来使用。
  • 如果您希望您的 WiresharkFile 再次可用,请不要丢弃它。如果您只想在每次调用后释放 BinaryReader,请仅在 that 对象上调用 using
  • @davidhol 我更新了我的答案。
  • 在这里面使用我循环我的文件并读取数据包,这意味着 BinaryReader 读取字节。所以在这种情况下,在 PlayBehavior 中使用这个“使用”世界是可以的?
猜你喜欢
  • 1970-01-01
  • 2016-05-18
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 2013-01-11
  • 2015-06-23
  • 2018-08-22
相关资源
最近更新 更多