Re: [問題] return的區域變數scope?

看板C_Sharp (C#)作者 (替機殼洗個熱水澡)時間20年前 (2005/09/14 01:26), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串4/5 (看更多)
※ 引述《tomex (tomex_ou)》之銘言: : ※ 引述《NCRCD (光和影的謎題)》之銘言: : : 你忽略了很基本的問題: : : 1.scope和動態配置(new)的記憶體空間是不相關的 : : 所以new出來的東西不會因為scope而釋放, 另外覺得你對C#的GC似乎 : : 也不是很瞭解, C#的GC在回收時只會回收完全被沒有被參考到的物件, : : 所以dt1參考的物件是不會被回收的, 我覺得你需要去看看GC的運作機制. : 謝謝,stack的變數名,及heap的記憶體空間, : 雖然透過scope的操作讓ref關係消失而被回收空間 : 但「GC不會回收被ref到記憶體」這原則,則可解釋原因。 : : 2.在C#裡除了數值型別, 其他型別不加方法參數都是傳參考(包括string) : : 所以string接收時不會複制1份新的記憶體空間. : TextBox1.Text = "abc"; : string s = TextBox1.Text; // if不會複製,為何不同了呢? : s = "123"; // TextBox1.Text = "abc" : string的指派都是會產生不同的記憶體空間 : 因此才會有StringBuilder等append()來增加效能的物件。 : 我倒是認為,c#無論傳遞什麼,都是採「複製」的方式 : 例如reference type的變數傳入method()當參數, : 是複製了一份ref變數,只是指向相同的位址 : 否則何需要創造ref/out等關鍵字呢? 其實有點看不太懂 你們指的複製,指的是heap 的複製還是 stack的複製 每一次的字串指派, heap應該都不會複製,而是新建。 就你上面那個例子(TextBox1.Text) 感覺你指的是 heap 的? 但 s= "123"; 不就單純的配置 heap 出 123 然後將 s的value 指到 123 至於函式參數傳遞的方面, 所以string接收時不會複制1份新的記憶體空間 指的應該也是 heap 吧,這也是不會複製啊? 但根據 out/ref 則會決定是否複製 stack 中 value的值吧, foo( string s) { s="123"; } main() { 1 string XD="456; 2 foo(XD); } 在第二行的時候 s的 value 跟 XD的 Value 應該是一樣的吧,但位址不一樣(複製), 然後版主說的「沒複製為何會一樣」因為在 s="123"; 那行時 s的 value 改變為 123 的位址啦~ 有錯請指正 ^^ -- ----------------------------------------------------------------------------- 功課重,Project多的好幫手--專案王 http://steven.twbbs.org/ProjectKing 增加右鍵的威力RightMenuKing--右鍵王 http://steven.twbbs.org/RightMenuKing/ 備份重要檔案的好幫BackupKing--備份王 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.216.156

211.78.132.15 09/14, , 1F
ReferenceType變數類似指標,ref var類似指標的指
211.78.132.15 09/14, 1F
文章代碼(AID): #139mkq1i (C_Sharp)
文章代碼(AID): #139mkq1i (C_Sharp)