熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

對string類型和stringBuilder類型的研究

2013-11-13 10:24:45  來源: .NET編程 

  using System;
using SystemCollectionsGeneric;
using SystemText;

  namespace TestString
{
    class Program
    {
      
        static void Main(string[] args)
        {
            //在一次群組討論中談到了string的類型問題雖然它是引用類型卻具有很多值類型的特點關於這個問題做了如下研究
            //由於程序中可能存在大量的相同字符串為了節省內存C#應該是將下面兩個變量都引用存放在同一個棧的test
            string myString = test;
            string myString = myString;
            //那麼按照引用的理論修改其中的一個字符串另一個就應該跟著改變例如做如下修改
            myString = New test;
            ConsoleWriteLine(myString);
            //此時按理說myString應該也變成New test但事實上經過測試myString 還是 test這是為什麼呢?
            //我分析微軟應該是在string類型中引入了copyonwrite技術就是說我們在修改string類型變量的時候

  //其實是重新開辟了一塊內存將修改後的內容放進去
            //再利用=把修改後的數據所在棧的地址傳給被修改的字符串變量來達到修改字符串變量的目的!
            //下面的測試很好的說明了這個問題
            myStringReplace(ta);
            ConsoleWriteLine(myString);
            //myStringReplace(ta);方法是把該字符串中的字母t換成字母a但是經過測試myString的內容依然是test

  //這就是因為雖然開辟了新空間並且將修改後的值存了進去
            //但是沒有用=將新數據棧的地址傳給myString

  所以myString的值沒變!

  //與string類型相對應StringBuilder類型則有所不同
            StringBuilder mySb = new StringBuilder(test);
            StringBuilder mySb = new StringBuilder(test);
            //StringBuilder類型在引用存放數據的棧之前加入了一個中間棧也就是說mySb指向它的中間棧

  //假設這個中間棧叫stack然後stack再指向存放test的棧
            //mySb也指向它的中間棧stack然後stack也指向存放test的那個棧當mySb被修改時

  //依然是采用copyonwrite技術但是開辟新的棧並且把修改後的數據放進去後
            //會自動修改stack讓他重新指向新的數據棧而mySb一直還是指向中間棧stack

  //這樣就實現了直接的修改而不用使用=來傳遞新地址給mySb看下面的測試
            mySbReplace(ta);
            ConsoleWriteLine(mySb);
            //果然mySb被成功修改了!
            //Ps以上代碼雖然有些警告但是可以運行主要是專注於說明問題忽略了一些細節比如賦值了的變量未使用等問題望見諒!

  }
    }
}


From:http://tw.wingwit.com/Article/program/net/201311/13532.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.