Re: [問題] return的區域變數scope?
※ 引述《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
211.78.132.15 09/14, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 5 篇):
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章