作者YiMMiY (YiMMiY)
看板C_Sharp
標題[問題] Stream未Dispose
時間Fri Mar 9 17:08:23 2018
想請版友幫忙修正觀念
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://webptt.com/m.aspx?n=bbs/C_Sharp/M.1520586506.A.1C8.html
1F:推 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
2F:推 free112136: 萬一ex,stream可能會在活久一點,有using就會保證在大 03/10 09:05
3F:→ free112136: 括號出去會呼叫dispose 03/10 09:05
4F:→ ssccg: 就GC不保證什麼時候做,時間可能是差很久 03/10 20:07
6F:→ landlord: unmanaged資源因為不歸CLR管,不知道何時以及如何釋放 03/12 22:51
7F:→ landlord: 所以如果沒有被dispose,最後是呼叫該type的finalize() 03/12 22:52
8F:→ landlord: 把外部資源咬住不放掉是一件很危險的事,例如 03/12 22:52
9F:→ landlord: DB connection 咬住,不放掉,通常結果就是兩種 03/12 22:52
10F:→ landlord: connection pool 滿了,無可用connection 03/12 22:53
11F:→ landlord: 這條connection還在使用中,不給你用。 03/12 22:53
12F:→ landlord: 大概就像你要搬檔案,Windows說有其他process使用中 03/12 22:54
13F:→ landlord: 你要退出某個usb裝置,它跟你說還在使用中一樣... 03/12 22:54
14F:→ YiMMiY: 感謝說明~~~ 03/14 23:34