[回到版面]
回應模式
名 稱
內 文
附加圖檔[] []
  • 可附加圖檔類型:GIF, JPG, JPEG, PNG, WEBM,瀏覽器才能正常附加圖檔
  • 附加圖檔最大上傳資料量為 3072 KB。
  • 當檔案超過寬 125 像素、高 125 像素時會自動縮小尺寸顯示
  • 目前附加圖檔使用量大小: 262209 KB / 500000 KB
  • 回覆時程式碼縮排會被trim消掉,請善用[code][/code]標色或貼到ideone等網站
  • LaTeX記法可以用「$$」或「\( \)」包起來,例如「$\sum_{k=1}^{k=n} k^2 = \frac{n(n+1)(n+2)}{6}$」
  • 投稿時請點擊畫像認證後,再按下 [送出] 按鈕提交。
  • 鬧板、攻擊性發言、煽動性發言請無視(回應者也無視),並使用del或在貓管理部向管理員回報。
  • 新介面尚處於測試階段,如果有任何問題可以向管理員或於程設交流版反映。

檔名:1585717589069.png-(1341 KB, 1150x680)
1341 KB
無題無名20/04/01(三)13:06:29 ID:RS/8sEugNo.14119del
最近學C#看到這個using用法
這不擺明就是GC造成的坑嗎wwwww
using (System.IO.StreamReader sr = 
new System.IO.StreamReader(@"C:\test.txt"))
{
string s = null;
while((s = sr.ReadLine()) != null)
{
Console.WriteLine(s);
}
}

我很好奇為何不坦蕩蕩的寫成下面這樣就好
只是怕忘記嗎?
System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\test.txt");
string s = null;
while((s = sr.ReadLine()) != null)
{
Console.WriteLine(s);
}
((IDisposable)sr).Dispose();
無名20/04/01(三)14:06:22 ID:Rk3DcqJINo.14120del
syntax sugar
using在compile時會自動變成下邊那樣
無名20/04/01(三)14:10:10 ID:Rk3DcqJINo.14121del
而且using 中的sr 只可以用在using(){} 中
出了去會找不到, 會compile error

但((IDisposable)sr).Dispose();sr=null;之後
還可以sr.ReadLine(); // run exception
無名20/04/01(三)17:17:35 ID:wh6n9XMcNo.14123del
就是怕開了之後忘記關
但是和GC沒有半點關係
無名20/04/01(三)20:46:07 ID:3bLiwENYNo.14127del
>>14123
不就是gc不方便管
所以要工程師指定釋放的時機
就是為了補gc無法即時歸還資源的弱點
無名20/04/05(日)03:38:36 ID:js4plUjoNo.14130del
>>14127
這的確和GC沒關係
GC只管記憶體不管IO
有佔用到FD的東西還是要自己處理

記憶體比較像是一個共用的pool
誰拿哪一塊都沒差 所以可以給GC管
但FD不一樣 因為FD是獨佔資源 誰應該拿哪個
什麼時候該還都應該要清楚定義 所以本來就不該給GC管
無名20/04/05(日)14:31:32 ID:Dj6cv3.6No.14131del
>>14130
但是C++沒GC就很自然的處理
沒人使用就自然釋放資源
不用擔心越積越多
無名20/04/06(一)05:47:16 ID:NM.TI14UNo.14135del
using是要解決exception後沒Dispose到
正確是要這樣寫
System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\test.txt");
try
{
string s = null;
while((s = sr.ReadLine()) != null)
{
Console.WriteLine(s);
}
}
finally
{
((IDisposable)sr).Dispose();
}

跟GC沒關係
無名20/04/06(一)21:34:41 ID:beJDQwgQNo.14140del
GC只能管VM的heap
IDisposable這種多半是代表作業系統給的資源 不是VM內的記憶體 只能手動關閉

using只是一個語法糖

讓你不用寫一大串try finally 像>>14135那樣
就是怕執行try block忘記把IDisposable代表的資源關閉 他就永遠沒關 等於是編譯器幫你寫好finally block


【刪除文章】[]
刪除用密碼: