看板 C_Sharp 關於我們 聯絡資訊
想請版友幫忙修正觀念 if(true) { StreamReader sr=new StreamReader(XXX);//ex:讀取某檔 //...A點 做事情 } //...B點 做事情 上述程式中 雖然sr並未做Dispose(),但sr是if內的區域變數 執行到B點時,sr生命週期已結束,被判斷為Garbage,等待GC回收中 唯等待期間資源未釋放,可能造成被讀取的檔案鎖死 待GC回收後則恢復正常 請問 以上觀念有什麼要修正的部分嗎? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.140.87.11 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1520586506.A.1C8.html
totte: 1.使用using 或 2. 變數在外面宣告 03/09 18:34
謝謝回覆 我發現這樣問好像容易讓人誤會 其實我了解該怎麼使用(包含using,try catch finally等) 我想問的問題是 若我"故意"像這樣不做Dispose,是否如同我講的 離開if後,還是會自動被回收,資源還是會被釋放? 也就是上述例子有無做Dispose是不是結果都一樣,只是時間上有差別而已? 謝謝 ※ 編輯: YiMMiY (223.140.87.11), 03/09/2018 22:05:17
free112136: 萬一ex,stream可能會在活久一點,有using就會保證在大 03/10 09:05
free112136: 括號出去會呼叫dispose 03/10 09:05
ssccg: 就GC不保證什麼時候做,時間可能是差很久 03/10 20:07
landlord: https://imgur.com/a/OrT1Z 03/12 22:48
landlord: unmanaged資源因為不歸CLR管,不知道何時以及如何釋放 03/12 22:51
landlord: 所以如果沒有被dispose,最後是呼叫該type的finalize() 03/12 22:52
landlord: 把外部資源咬住不放掉是一件很危險的事,例如 03/12 22:52
landlord: DB connection 咬住,不放掉,通常結果就是兩種 03/12 22:52
landlord: connection pool 滿了,無可用connection 03/12 22:53
landlord: 這條connection還在使用中,不給你用。 03/12 22:53
landlord: 大概就像你要搬檔案,Windows說有其他process使用中 03/12 22:54
landlord: 你要退出某個usb裝置,它跟你說還在使用中一樣... 03/12 22:54
YiMMiY: 感謝說明~~~ 03/14 23:34