2015-11-30 17 views
-2

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) 
     { 

     } 
    } 
} 
+0

請閱讀關於using關鍵字的文獻以及何時使用它。您將它用於實現IDisposable接口的對象。 – Alex

+0

我的對象實現了IDisposable。 –

回答

3

調用using(this)永遠是有道理的。這意味着你自己打電話Dispose,這意味着A)你的班級將在using區塊末尾處於未定義狀態,B)撥打你的電話會看到你是IDisposable,並期望能夠控制你的一生,但你實際上是從你的代碼中自己控制它。

如果您的Libpcap的生命週期在傳輸呼叫後結束,您可以從PlayBehavior類中使用using - 它擁有對它的引用,因此它控制其生存期。

執行IDisposable是一個合同。通過這樣做,你會說「我的操作持有對非託管資源(文件,tcp連接等)的引用,當你完成我的發佈時,我的調用者需要調用我的Dispose方法」。如果這不是WiresharkFile預期的使用合同,則不會實施IDisposable。

如果您有創建和發佈爲您的正常操作的一部分非託管資源,但它並不需要呼叫方顯式釋放,乾脆自己動手 - 釋放內部非託管資源時你已經完成了。

+0

我在WiresharkFile上實現IDisposable,看看我的更新。 –

+0

順便說一下,這個傳輸調用後,我的對象仍然在列表中供將來使用。 –

+0

如果您希望WiresharkFile再次可用,請不要將其丟棄。如果你只想在每次調用之後丟棄BinaryReader,只能在*那個*對象上調用'using'。 –

相關問題