作者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/cn.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