作者virdust2003 (替机壳洗个热水澡)
看板C_Sharp
标题Re: [问题] return的区域变数scope?
时间Wed Sep 14 01:35:01 2005
※ 引述《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
1F:推 tomex:ReferenceType变数类似指标,ref var类似指标的指 211.78.132.15 09/14