[問題] Stream未Dispose

看板C_Sharp作者 (YiMMiY)時間6年前 (2018/03/09 17:08), 6年前編輯推噓2(2012)
留言14則, 5人參與, 6年前最新討論串1/1
想請版友幫忙修正觀念 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

03/09 18:34, 6年前 , 1F
1.使用using 或 2. 變數在外面宣告
03/09 18:34, 1F
謝謝回覆 我發現這樣問好像容易讓人誤會 其實我了解該怎麼使用(包含using,try catch finally等) 我想問的問題是 若我"故意"像這樣不做Dispose,是否如同我講的 離開if後,還是會自動被回收,資源還是會被釋放? 也就是上述例子有無做Dispose是不是結果都一樣,只是時間上有差別而已? 謝謝 ※ 編輯: YiMMiY (223.140.87.11), 03/09/2018 22:05:17

03/10 09:05, 6年前 , 2F
萬一ex,stream可能會在活久一點,有using就會保證在大
03/10 09:05, 2F

03/10 09:05, 6年前 , 3F
括號出去會呼叫dispose
03/10 09:05, 3F

03/10 20:07, 6年前 , 4F
就GC不保證什麼時候做,時間可能是差很久
03/10 20:07, 4F

03/12 22:48, 6年前 , 5F

03/12 22:51, 6年前 , 6F
unmanaged資源因為不歸CLR管,不知道何時以及如何釋放
03/12 22:51, 6F

03/12 22:52, 6年前 , 7F
所以如果沒有被dispose,最後是呼叫該type的finalize()
03/12 22:52, 7F

03/12 22:52, 6年前 , 8F
把外部資源咬住不放掉是一件很危險的事,例如
03/12 22:52, 8F

03/12 22:52, 6年前 , 9F
DB connection 咬住,不放掉,通常結果就是兩種
03/12 22:52, 9F

03/12 22:53, 6年前 , 10F
connection pool 滿了,無可用connection
03/12 22:53, 10F

03/12 22:53, 6年前 , 11F
這條connection還在使用中,不給你用。
03/12 22:53, 11F

03/12 22:54, 6年前 , 12F
大概就像你要搬檔案,Windows說有其他process使用中
03/12 22:54, 12F

03/12 22:54, 6年前 , 13F
你要退出某個usb裝置,它跟你說還在使用中一樣...
03/12 22:54, 13F

03/14 23:34, 6年前 , 14F
感謝說明~~~
03/14 23:34, 14F
文章代碼(AID): #1QeayA78 (C_Sharp)