作者NCRCD (光和影的謎題)
看板C_Sharp
標題Re: [問題] return的區域變數scope?
時間Wed Sep 14 01:51:35 2005
※ 引述《tomex (tomex_ou)》之銘言:
: ※ 引述《NCRCD (光和影的謎題)》之銘言:
: : 2.在C#裡除了數值型別, 其他型別不加方法參數都是傳參考(包括string)
: : 所以string接收時不會複制1份新的記憶體空間.
: TextBox1.Text = "abc";
: string s = TextBox1.Text; // if不會複製,為何不同了呢?
: s = "123"; // TextBox1.Text = "abc"
呃, 我不瞭解前面所說的不同是?
在第二行結束他們兩個都是參考指向同一個物件
--
我自己寫了個簡易程式:
class Test{
static void Main(string[] args){
string a,b="abc";
a=b;
Console.WriteLine((object)a==(object)b);
}
}
出來的結果的確是"True"
: string的指派都是會產生不同的記憶體空間
: 因此才會有StringBuilder等append()來增加效能的物件。
我想你弄錯了
之所以會有StringBuilder這種物件的確是為了增進效能
但原因不是指派string的關係, 而是改變string內容時效能低落的原因
而是因為每個string物件一生成就不會再變了
也就是說你new出來一個string叫str內容為"xyz"
而你對它做str=str+"abc"時會再生成一個新的string內容為"xyzabc"給str
所以才有StringBuilder
而至於指派時只是把參考傳過去, 真正物件還是只有一份
: 我倒是認為,c#無論傳遞什麼,都是採「複製」的方式
: 例如reference type的變數傳入method()當參數,
: 是複製了一份ref變數,只是指向相同的位址
: 否則何需要創造ref/out等關鍵字呢?
我突然覺得我們的意思似乎是一樣的
你所說的"複製"就我說的"傳參考"
我說的"傳參考"就是把物件位置複製一次
是不是這樣 @@?
--
不過用你說的"複製"真的容易讓人誤會啊 orz
還是用"傳參考"比較不容易弄錯 @@"
--
智慧 是成功的任意門
信心 是成功的促進劑
機緣 是成功的必需品
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.141.225
推 tomex:我所說的「複製」指heap copy, not heap copy. 211.78.132.15 09/14
推 tomex:筆誤,stack copy, not heap copy. 211.78.132.15 09/14
推 tomex:另,c#的==並不等於reference.equal喔! 211.78.132.15 09/14