none
實作 IDisposable RRS feed

  • 問題

  • public class CodePorcess : IDisposable
    {
            public void Dispose()
        {
            GC.SuppressFinalize(this);
        }
            ~CodePorcess()
            {
                Dispose();
            }
        private string thiskey { get; set; }
    
        public DEAES(string DEstring)
        {
            return Destring;
        }
        public CodePorcess(string setkey)
        {
            thiskey = setkey;
        }<br/> }
    
        protected void Button1_Click(object sender, EventArgs e)
        {
            CodePorcess cp = new CodePorcess("test");
            cp.Dispose();
            tb3.Text = cp.DEAES(tb2.Text);
        }
    


    為什麼已經dispose 了

    還可以呼叫他的函式?

    2011年12月15日 上午 03:01

解答

  • 設為 null 才是正確作法。

    Dispose() 是給物件處理一些直接設定為 null 時 GC 放不掉的東西,像是 Office 的物件,Win32 API 或是 Unmanaged 的物件等等。

    不是每個物件都有實作 IDisposable。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    • 已標示為解答 蛤? 2011年12月19日 上午 05:37
    2011年12月15日 上午 10:38
    版主

所有回覆

  • 這在執行階段就會發生例外了。

    在程式開發時,開發環境目前沒有那麼聰明到會幫你判斷是否呼叫了Dispose()。

    2011年12月15日 上午 03:13
  • 可是在執行階段他並沒有產生例外。

    好奇妙

    2011年12月15日 上午 03:44
  • Dispose() 和將它設為 null (真正解構) 是兩回事 ...

    http://msdn.microsoft.com/zh-tw/library/system.idisposable.dispose(VS.80).aspx


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    2011年12月15日 上午 03:57
    版主
  • 實作 IDispose 的目的是:  實作 IDisposable 介面的物件會從 IDisposable.Dispose 方法呼叫這個方法,以免記憶體回收行程在不需要 Object.Finalize 的物件上呼叫它 (Objects that implement the IDisposable interface can call this method from the IDisposable.Dispose method to prevent the garbage collector from calling Object.Finalize on an object that does not require it) (參考 http://msdn.microsoft.com/zh-tw/library/system.gc.suppressfinalize.aspx)

    要解構一個物件, 把它指定為 null 就行了。




    • 已編輯 Johnny.Net 2011年12月15日 上午 04:06
    2011年12月15日 上午 04:05
  • 小朱跟Johnny 提供的文章都有看過了,還是一知半解

    後來我爬了這篇文:http://social.msdn.microsoft.com/Forums/zh-HK/233/thread/876415a1-4918-4184-ab6a-32a91adf2656

    小歐說:dispose -> 明確指定可被釋放 -> GC 第一次執行就會釋放掉。

    bill說:以執行個體的觀點來看, 當沒有任何變數參照它的時候, GC 才會回收。

    Jenny 說:要解構一個物件, 把它指定為 null 就行了。

    這篇文章有提到 當 new 出來的物件為 null 時 該物件會自動呼叫 Dispose 。

     

        protected void Button1_Click(object sender, EventArgs e)
        {
            CodePorcess cp = new CodePorcess("test");
            cp.Dispose();
            tb3.Text = cp.DEAES(tb2.Text);
        }

    所以在網頁裡面 cp 這個物件,何時會被釋放掉?

    如果我用完了要釋放物件時到底該  = Null 還是Dispos() ?


    • 已編輯 蛤? 2011年12月15日 上午 09:37
    2011年12月15日 上午 09:32
  • 設為 null 才是正確作法。

    Dispose() 是給物件處理一些直接設定為 null 時 GC 放不掉的東西,像是 Office 的物件,Win32 API 或是 Unmanaged 的物件等等。

    不是每個物件都有實作 IDisposable。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    • 已標示為解答 蛤? 2011年12月19日 上午 05:37
    2011年12月15日 上午 10:38
    版主

  • 小朱指的是:當類別中有使用一些「就算」設定為null 時 GC 也無釋放的物件,這時就有必要實作IDisposable,以確保能夠完整的釋放。

    那我寫的

    public class CodePorcess : IDisposable
    

    ,裡面沒有GC無法釋放的物件,頂多是叫用DLL ,所以沒有必要實作IDisposable,用完之後設定為null 就行了?

     

    很抱歉需要問到這麼詳細,為避免不求甚解加上我的理解力並非很好,請各位大大多多包函。

    2011年12月16日 上午 01:00
  • 如果只是用到 Managed 的資源,是可以不用實作 IDisposable 的。
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    2011年12月16日 下午 12:34
    版主