Feeds:
文章
留言

Archive for 六月 16th, 2006

今天在繁體中文MSDN看到一個有趣的問題,原文出處在http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=480641&SiteID=14&mode=1,他的問題摘錄如下:

string s1 = "AAA";
            string s2 = s1;
            s2 = "BBB";
            System.Console.WriteLine("{0}", s1);

我想要讓 s1的變數藉由s2來賦值成BBB

這個問題可以看出他用C/C++的觀念再寫C#,不過他的問題為什麼和預期的不同呢?

 

基本上,上面的寫法和在 C/C++ 中的涵義不太一樣,如果是C/C++s1 s2 參照到同一塊記憶體位置,所以,無論 s1 s2 進行修改時,另一個的資料會同步改變,這是可以理解。


過如果在 C# 中,s1 s2 是參照到同一個 string object,而 string object 的內容資料是不允許被修改,所以 s2 = "BBB" 會產生另一個 "BBB" string object,並且 s2 會重新參照到 "BBB" 這個新的 string object,和 s1 參照到不同的 object

 

所以針對上面哪個問題的解法我想到一個,因為 string object 不允許被修改,所以會產生一個新的 object,那就使用一個允許被修改的 string object,如此 s1 s2 的參照就不會被改變,那就是用 StringBuilde

範例如下

            StringBuilder s1 = new StringBuilder(“AAA”);
            StringBuilder s2 = s1;
            s2.Length = 0;
            s2.Append("BBB");
            Console.WriteLine(s1.ToString());  // "BBB"

Read Full Post »