Re: [問題] return的區域變數scope?
※ 引述《tomex (tomex_ou)》之銘言:
: 假如有個一函數傳回DataTable物件:
: DataTable GetDataTable()
: {
: DataTable dt = new DataTable();
: ...
: return dt;
: }
: DataTable dt1 = GetDataTable(); //這行是正常的, dt1指向dt記憶體位置
: dt1.Rows(); // dt是區域變數物件,scope已消失,隨時被回收, dt1危險!
: 最近學c++,特別重視記憶體管理,
: 以前用c#都沒在乎dt是有scope範圍的local變數,
: 現在好像覺得蠻危險的。
: return string比較沒問題,因為string接收時都採複制1份新的記憶體空間
: 但物件似乎不是如此
: 雖然gc沒那麼快回收,但終究是超出scope範圍的變數,
: 大家怎麼看這問題呢?
你忽略了很基本的問題:
1.scope和動態配置(new)的記憶體空間是不相關的
所以new出來的東西不會因為scope而釋放, 另外覺得你對C#的GC似乎
也不是很瞭解, C#的GC在回收時只會回收完全被沒有被參考到的物件,
所以dt1參考的物件是不會被回收的, 我覺得你需要去看看GC的運作機制.
2.在C#裡除了數值型別, 其他型別不加方法參數都是傳參考(包括string)
所以string接收時不會複制1份新的記憶體空間.
--
智慧 是成功的任意門
信心 是成功的促進劑
機緣 是成功的必需品
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.141.225
※ 編輯: NCRCD 來自: 140.113.141.225 (09/13 13:34)
討論串 (同標題文章)
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章
14
39