none
參考類型變數重複宣告疑惑 RRS feed

  • 問題

  • 想問一下

    常會碰到一個問題

    就是當我程式中的參考類型變數要改變內容時不知是否要先釋放掉

     

    舉個例子來說

    程式碼區塊

     

    Class A :Label

    {

    private Font m_MyFont=new Font();

    void A_FontChanged(Object sender , System.EventArgs e )

    {

     m_MyFont= New Font(Font.Name, Height, Font.Style, GraphicsUnit.Pixel);

    }

    }

     

     

    若是MyFont想在Font設定改變時隨之改變

    會在重NEW一個

    但是我在想是不是應該寫成下面這樣才對(先釋放)

    程式碼區塊

     

    Class A :Label

    {

    private Font m_MyFont=new Font();

    void A_FontChanged(Object sender , System.EventArgs e )

    {

     m_MyFont.Dispose();

     m_MyFont=NULL;

     m_MyFont= New Font(Font.Name, Height, Font.Style, GraphicsUnit.Pixel);

    }

    }

     

     

    2007年10月24日 上午 02:15

所有回覆

  • HI,

     

    原則上寫第一種做法即可, 物件不再使用後, 會由,NET平台的Garbage Collection機制負責回收, 不需要另外處理, 除非有特殊的考量

     

    tihs

    2007年10月24日 上午 02:25
  • 嗯..這點我也有想到說

    可是大部份書上都建議實作Dispose介面

    也建議Dispose掉

    靠GC不是會比較不即時嗎(不知道它何時會回收)

    So...第一種作法不是會很佔記憶體嗎?!(還沒回收就又New一個)

    但是大多書上好像都是用第一種

    2007年10月24日 上午 03:00
  • 程式使用的資源不只有記憶體而已

    還有檔案,物件,互斥鎖..等

    而GC回收的是記憶體

    Dispose介面是要釋放其他資源時需要去實作的

     

    然而 有實作Dispose介面的類別在被GC會先呼叫Dispose來釋放那些GC管不到的資源

     

    2007年10月24日 上午 03:46
  • 上面二種我都沒用過,我都用GC去收.

    現在的電腦那麼好記憶體都1,2G,對小程式不會有影響,除非你去寫PDA或機器..資源限制在去考量.

    我寫程式比較在意結構性,怎麼低偶合高內聚...,如果像你這樣寫會多很多Code,寫小程式是沒差,但像我寫百萬行的Code就差很多.

    資訊釋放寫在Dispose 是沒錯,但更好的做法是用完後就釋放而不是到Dispose在釋放,比如你寫一支元件,裡面有十個方法,其中只有一個用到檔案,所以寫的時候只有在那個方法裡產生檔案,用完後馬上釋放,而不是在整個元件的Dispose在釋放.

    2007年10月24日 上午 07:50
  • 嗯嗯

    但是Efficient c#書上有提到一點

    就是宣告很頻煩的要提升成全域變數

    好像頻煩的宣告也會造成浪費...

    此時的全域變數應該就是要用到Dispose去釋放了吧

     

    順便問一下,您提及的"資訊釋放寫在Dispose 是沒錯,但更好的做法是用完後就釋放而不是到Dispose在釋放",資源用完後就釋放好像也是呼叫Dispose吧

    2007年10月24日 上午 09:17
  • Dispose 是一定會呼叫的,如果你宣告Unmanaged 的資源為全域變數,你就要實做IDispose 確保 Unmanaged 的資訊有被釋放.

    而是否要宣告 Unmanged 當全域變數看你的需求而定,當然以Efficient C# 他是教 C#他當然這樣寫讓你知道怎麼用,但當你以後有學OO,Design Pattern....以後你就知道各種寫法,及其優缺點...

    已我目前的寫做模型來看,目前還還沒有實做IDispose.

    2007年10月24日 上午 09:31