乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      StringBuilder的實現(xiàn)與技巧

       orion360doc 2011-02-16

      StringBuilder的實現(xiàn)與技巧
      在上一篇進一步了解String
      中,發(fā)現(xiàn)了string的不便之處,而string的替代解決方案就是StringBuilder的使用..它的使用也很簡單System.Text.StringBuilder
      sb = new System.Text.StringBuilder();這樣就初始化了一個StringBuilder
      ..之后我們可以通過Append()來追加字符串填充到sb中..在你初始化一個StringBuilder 之后,它會自動申請一個默認(rèn)的StringBuilder
      容量(默認(rèn)值是16),這個容量是由Capacity來控制的.并且允許,我們根據(jù)需要來控制Capacity的大小,也可以通過Length來獲取或設(shè)置StringBuilder
      的長度..
      先來看Length的用法:


      1System.Text.StringBuilder sb = new System.Text.StringBuilder();
      2sb.Append( "123456789" );//添加一個字符串
      3sb.Length = 3;//設(shè)置容量為3
      4Console.WriteLine( sb.ToString() );//這里輸出:123
      5
      6sb.Length = 30;//重新設(shè)置容量為30
      7Console.WriteLine( sb.ToString() + ",結(jié)尾");//這里在原來字符串后面補齊空格,至到Length的為30
      8Console.WriteLine( sb.Length );//這里輸出的長度為30

      通過上面的代碼,我們可以看出如果StringBuilder 中的字符長度小于Length的值,則StringBuilder
      將會用空格硬填充StringBuilder ,以滿足符合長度的設(shè)置..如果StringBuilder
      中的字符長度大于Length的值,則StringBuilder 將會截取從第一位開始的Length個字符..而忽略超出的部分..

      再來看看最重要的部分Carpacity的用法:
       1System.Text.StringBuilder sb = new
      System.Text.StringBuilder();//初始化一個StringBuilder
       2Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       3Console.WriteLine( "\t Length:" + sb.Length );
       4
       5sb.Append( '1',17 );//添加一個字符串,這里故意添加17個字符,是為了看到Capacity是如何被擴充的
       6Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       7Console.WriteLine( "\t Length:" + sb.Length );
       8
       9sb.Append( '2',32 );//添加一個字符串
      10Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      11Console.WriteLine( "\t Length:" + sb.Length );
      12
      13sb.Append( '3',64 );//添加一個字符串
      14Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      15Console.WriteLine( "\t Length:" + sb.Length );
      16
      17//注意這里:如果你取消Remove這步操作,將會引發(fā)ArgumentOutOfRangeException異常,因為當(dāng)前容量小于
      18
      19//Length,這在自己控制StringBuilder的時候務(wù)必要注意容量溢出的問題
      20
      21sb.Remove(0,sb.Length);//移出全部內(nèi)容,再測試
      22sb.Capacity = 1;//重新定義了容量
      23sb.Append( 'a',2 );
      24Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      25Console.WriteLine( "\t Length:" + sb.Length );
      26
      27sb.Append( 'b',4 );
      28Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      29Console.WriteLine( "\t Length:" + sb.Length );
      30
      31sb.Append( 'c',6 );
      32Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      33Console.WriteLine( "\t Length:" + sb.Length
      上面的代碼輸出的結(jié)果:
      1Capacity:16     Length:0    //輸出第一次,默認(rèn)的Capacity是16
      2Capacity:32     Length:17    //第二次,我們故意添加了17個字符,于是Capacity=Capacity*2
      3Capacity:64     Length:49    //繼續(xù)超出,則Capacity=Capacity*2
      4Capacity:128     Length:113
      5Capacity:3     Length:2    //清空內(nèi)容后,設(shè)置Capacity=1,重新添加了字符
      6Capacity:7      Length:6    //后面的結(jié)果都類似
      7Capacity:14     Length:12
      從上面的代碼和結(jié)果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認(rèn)的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
      >= Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結(jié)果,就可以推斷出Capacity的公式:
      if ( Capacity < Length && Capacity > 0 ){
            Capacity *= 2;
      }

       1System.Text.StringBuilder sb = new
      System.Text.StringBuilder();//初始化一個StringBuilder
       2Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       3Console.WriteLine( "\t Length:" + sb.Length );
       4
       5sb.Append( '1',17 );//添加一個字符串,這里故意添加17個字符,是為了看到Capacity是如何被擴充的
       6Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       7Console.WriteLine( "\t Length:" + sb.Length );
       8
       9sb.Append( '2',32 );//添加一個字符串
      10Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      11Console.WriteLine( "\t Length:" + sb.Length );
      12
      13sb.Append( '3',64 );//添加一個字符串
      14Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      15Console.WriteLine( "\t Length:" + sb.Length );
      16
      17//注意這里:如果你取消Remove這步操作,將會引發(fā)ArgumentOutOfRangeException異常,因為當(dāng)前容量小于
      18
      19//Length,這在自己控制StringBuilder的時候務(wù)必要注意容量溢出的問題
      20
      21sb.Remove(0,sb.Length);//移出全部內(nèi)容,再測試
      22sb.Capacity = 1;//重新定義了容量
      23sb.Append( 'a',2 );
      24Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      25Console.WriteLine( "\t Length:" + sb.Length );
      26
      27sb.Append( 'b',4 );
      28Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      29Console.WriteLine( "\t Length:" + sb.Length );
      30
      31sb.Append( 'c',6 );
      32Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      33Console.WriteLine( "\t Length:" + sb.Length
      上面的代碼輸出的結(jié)果:
      1Capacity:16     Length:0    //輸出第一次,默認(rèn)的Capacity是16
      2Capacity:32     Length:17    //第二次,我們故意添加了17個字符,于是Capacity=Capacity*2
      3Capacity:64     Length:49    //繼續(xù)超出,則Capacity=Capacity*2
      4Capacity:128     Length:113
      5Capacity:3     Length:2    //清空內(nèi)容后,設(shè)置Capacity=1,重新添加了字符
      6Capacity:7      Length:6    //后面的結(jié)果都類似
      7Capacity:14     Length:12
      從上面的代碼和結(jié)果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認(rèn)的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
      >= Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結(jié)果,就可以推斷出Capacity的公式:
      if ( Capacity < Length && Capacity > 0 ){
            Capacity *= 2;
      }


      通過上面的代碼,我們可以看出如果StringBuilder 中的字符長度小于Length的值,則StringBuilder
      將會用空格硬填充StringBuilder ,以滿足符合長度的設(shè)置..如果StringBuilder
      中的字符長度大于Length的值,則StringBuilder 將會截取從第一位開始的Length個字符..而忽略超出的部分..

      再來看看最重要的部分Carpacity的用法: 1System.Text.StringBuilder sb = new
      System.Text.StringBuilder();//初始化一個StringBuilder
       2Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       3Console.WriteLine( "\t Length:" + sb.Length );
       4
       5sb.Append( '1',17 );//添加一個字符串,這里故意添加17個字符,是為了看到Capacity是如何被擴充的
       6Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       7Console.WriteLine( "\t Length:" + sb.Length );
       8
       9sb.Append( '2',32 );//添加一個字符串
      10Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      11Console.WriteLine( "\t Length:" + sb.Length );
      12
      13sb.Append( '3',64 );//添加一個字符串
      14Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      15Console.WriteLine( "\t Length:" + sb.Length );
      16
      17//注意這里:如果你取消Remove這步操作,將會引發(fā)ArgumentOutOfRangeException異常,因為當(dāng)前容量小于
      18
      19//Length,這在自己控制StringBuilder的時候務(wù)必要注意容量溢出的問題
      20
      21sb.Remove(0,sb.Length);//移出全部內(nèi)容,再測試
      22sb.Capacity = 1;//重新定義了容量
      23sb.Append( 'a',2 );
      24Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      25Console.WriteLine( "\t Length:" + sb.Length );
      26
      27sb.Append( 'b',4 );
      28Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      29Console.WriteLine( "\t Length:" + sb.Length );
      30
      31sb.Append( 'c',6 );
      32Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      33Console.WriteLine( "\t Length:" + sb.Length
      上面的代碼輸出的結(jié)果:
      1Capacity:16     Length:0    //輸出第一次,默認(rèn)的Capacity是16
      2Capacity:32     Length:17    //第二次,我們故意添加了17個字符,于是Capacity=Capacity*2
      3Capacity:64     Length:49    //繼續(xù)超出,則Capacity=Capacity*2
      4Capacity:128     Length:113
      5Capacity:3     Length:2    //清空內(nèi)容后,設(shè)置Capacity=1,重新添加了字符
      6Capacity:7      Length:6    //后面的結(jié)果都類似
      7Capacity:14     Length:12
      從上面的代碼和結(jié)果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認(rèn)的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
      >= Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結(jié)果,就可以推斷出Capacity的公式:
      if ( Capacity < Length && Capacity > 0 ){
            Capacity *= 2;
      }

      1System.Text.StringBuilder sb = new System.Text.StringBuilder();
      2sb.Append( "123456789" );//添加一個字符串
      3sb.Length = 3;//設(shè)置容量為3
      4Console.WriteLine( sb.ToString() );//這里輸出:123
      5
      6sb.Length = 30;//重新設(shè)置容量為30
      7Console.WriteLine( sb.ToString() + ",結(jié)尾");//這里在原來字符串后面補齊空格,至到Length的為30
      8Console.WriteLine( sb.Length );//這里輸出的長度為30

      通過上面的代碼,我們可以看出如果StringBuilder 中的字符長度小于Length的值,則StringBuilder
      將會用空格硬填充StringBuilder ,以滿足符合長度的設(shè)置..如果StringBuilder
      中的字符長度大于Length的值,則StringBuilder 將會截取從第一位開始的Length個字符..而忽略超出的部分..

      再來看看最重要的部分Carpacity的用法:
       1System.Text.StringBuilder sb = new
      System.Text.StringBuilder();//初始化一個StringBuilder
       2Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       3Console.WriteLine( "\t Length:" + sb.Length );
       4
       5sb.Append( '1',17 );//添加一個字符串,這里故意添加17個字符,是為了看到Capacity是如何被擴充的
       6Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       7Console.WriteLine( "\t Length:" + sb.Length );
       8
       9sb.Append( '2',32 );//添加一個字符串
      10Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      11Console.WriteLine( "\t Length:" + sb.Length );
      12
      13sb.Append( '3',64 );//添加一個字符串
      14Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      15Console.WriteLine( "\t Length:" + sb.Length );
      16
      17//注意這里:如果你取消Remove這步操作,將會引發(fā)ArgumentOutOfRangeException異常,因為當(dāng)前容量小于
      18
      19//Length,這在自己控制StringBuilder的時候務(wù)必要注意容量溢出的問題
      20
      21sb.Remove(0,sb.Length);//移出全部內(nèi)容,再測試
      22sb.Capacity = 1;//重新定義了容量
      23sb.Append( 'a',2 );
      24Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      25Console.WriteLine( "\t Length:" + sb.Length );
      26
      27sb.Append( 'b',4 );
      28Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      29Console.WriteLine( "\t Length:" + sb.Length );
      30
      31sb.Append( 'c',6 );
      32Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      33Console.WriteLine( "\t Length:" + sb.Length
      上面的代碼輸出的結(jié)果:
      1Capacity:16     Length:0    //輸出第一次,默認(rèn)的Capacity是16
      2Capacity:32     Length:17    //第二次,我們故意添加了17個字符,于是Capacity=Capacity*2
      3Capacity:64     Length:49    //繼續(xù)超出,則Capacity=Capacity*2
      4Capacity:128     Length:113
      5Capacity:3     Length:2    //清空內(nèi)容后,設(shè)置Capacity=1,重新添加了字符
      6Capacity:7      Length:6    //后面的結(jié)果都類似
      7Capacity:14     Length:12
      從上面的代碼和結(jié)果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認(rèn)的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
      >= Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結(jié)果,就可以推斷出Capacity的公式:
      if ( Capacity < Length && Capacity > 0 ){
            Capacity *= 2;
      }

       1System.Text.StringBuilder sb = new
      System.Text.StringBuilder();//初始化一個StringBuilder
       2Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       3Console.WriteLine( "\t Length:" + sb.Length );
       4
       5sb.Append( '1',17 );//添加一個字符串,這里故意添加17個字符,是為了看到Capacity是如何被擴充的
       6Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       7Console.WriteLine( "\t Length:" + sb.Length );
       8
       9sb.Append( '2',32 );//添加一個字符串
      10Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      11Console.WriteLine( "\t Length:" + sb.Length );
      12
      13sb.Append( '3',64 );//添加一個字符串
      14Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      15Console.WriteLine( "\t Length:" + sb.Length );
      16
      17//注意這里:如果你取消Remove這步操作,將會引發(fā)ArgumentOutOfRangeException異常,因為當(dāng)前容量小于
      18
      19//Length,這在自己控制StringBuilder的時候務(wù)必要注意容量溢出的問題
      20
      21sb.Remove(0,sb.Length);//移出全部內(nèi)容,再測試
      22sb.Capacity = 1;//重新定義了容量
      23sb.Append( 'a',2 );
      24Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      25Console.WriteLine( "\t Length:" + sb.Length );
      26
      27sb.Append( 'b',4 );
      28Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      29Console.WriteLine( "\t Length:" + sb.Length );
      30
      31sb.Append( 'c',6 );
      32Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      33Console.WriteLine( "\t Length:" + sb.Length
      上面的代碼輸出的結(jié)果:
      1Capacity:16     Length:0    //輸出第一次,默認(rèn)的Capacity是16
      2Capacity:32     Length:17    //第二次,我們故意添加了17個字符,于是Capacity=Capacity*2
      3Capacity:64     Length:49    //繼續(xù)超出,則Capacity=Capacity*2
      4Capacity:128     Length:113
      5Capacity:3     Length:2    //清空內(nèi)容后,設(shè)置Capacity=1,重新添加了字符
      6Capacity:7      Length:6    //后面的結(jié)果都類似
      7Capacity:14     Length:12
      從上面的代碼和結(jié)果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認(rèn)的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
      >= Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結(jié)果,就可以推斷出Capacity的公式:
      if ( Capacity < Length && Capacity > 0 ){
            Capacity *= 2;
      }


      通過上面的代碼,我們可以看出如果StringBuilder 中的字符長度小于Length的值,則StringBuilder
      將會用空格硬填充StringBuilder ,以滿足符合長度的設(shè)置..如果StringBuilder
      中的字符長度大于Length的值,則StringBuilder 將會截取從第一位開始的Length個字符..而忽略超出的部分..

      再來看看最重要的部分Carpacity的用法: 1System.Text.StringBuilder sb = new
      System.Text.StringBuilder();//初始化一個StringBuilder
       2Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       3Console.WriteLine( "\t Length:" + sb.Length );
       4
       5sb.Append( '1',17 );//添加一個字符串,這里故意添加17個字符,是為了看到Capacity是如何被擴充的
       6Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       7Console.WriteLine( "\t Length:" + sb.Length );
       8
       9sb.Append( '2',32 );//添加一個字符串
      10Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      11Console.WriteLine( "\t Length:" + sb.Length );
      12
      13sb.Append( '3',64 );//添加一個字符串
      14Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      15Console.WriteLine( "\t Length:" + sb.Length );
      16
      17//注意這里:如果你取消Remove這步操作,將會引發(fā)ArgumentOutOfRangeException異常,因為當(dāng)前容量小于
      18
      19//Length,這在自己控制StringBuilder的時候務(wù)必要注意容量溢出的問題
      20
      21sb.Remove(0,sb.Length);//移出全部內(nèi)容,再測試
      22sb.Capacity = 1;//重新定義了容量
      23sb.Append( 'a',2 );
      24Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      25Console.WriteLine( "\t Length:" + sb.Length );
      26
      27sb.Append( 'b',4 );
      28Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      29Console.WriteLine( "\t Length:" + sb.Length );
      30
      31sb.Append( 'c',6 );
      32Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      33Console.WriteLine( "\t Length:" + sb.Length
      上面的代碼輸出的結(jié)果:
      1Capacity:16     Length:0    //輸出第一次,默認(rèn)的Capacity是16
      2Capacity:32     Length:17    //第二次,我們故意添加了17個字符,于是Capacity=Capacity*2
      3Capacity:64     Length:49    //繼續(xù)超出,則Capacity=Capacity*2
      4Capacity:128     Length:113
      5Capacity:3     Length:2    //清空內(nèi)容后,設(shè)置Capacity=1,重新添加了字符
      6Capacity:7      Length:6    //后面的結(jié)果都類似
      7Capacity:14     Length:12
      從上面的代碼和結(jié)果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認(rèn)的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
      >= Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結(jié)果,就可以推斷出Capacity的公式:
      if ( Capacity < Length && Capacity > 0 ){
            Capacity *= 2;
      }

      1System.Text.StringBuilder sb = new System.Text.StringBuilder();
      2sb.Append( "123456789" );//添加一個字符串
      3sb.Length = 3;//設(shè)置容量為3
      4Console.WriteLine( sb.ToString() );//這里輸出:123
      5
      6sb.Length = 30;//重新設(shè)置容量為30
      7Console.WriteLine( sb.ToString() + ",結(jié)尾");//這里在原來字符串后面補齊空格,至到Length的為30
      8Console.WriteLine( sb.Length );//這里輸出的長度為30

      通過上面的代碼,我們可以看出如果StringBuilder 中的字符長度小于Length的值,則StringBuilder
      將會用空格硬填充StringBuilder ,以滿足符合長度的設(shè)置..如果StringBuilder
      中的字符長度大于Length的值,則StringBuilder 將會截取從第一位開始的Length個字符..而忽略超出的部分..

      再來看看最重要的部分Carpacity的用法:
       1System.Text.StringBuilder sb = new
      System.Text.StringBuilder();//初始化一個StringBuilder
       2Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       3Console.WriteLine( "\t Length:" + sb.Length );
       4
       5sb.Append( '1',17 );//添加一個字符串,這里故意添加17個字符,是為了看到Capacity是如何被擴充的
       6Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       7Console.WriteLine( "\t Length:" + sb.Length );
       8
       9sb.Append( '2',32 );//添加一個字符串
      10Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      11Console.WriteLine( "\t Length:" + sb.Length );
      12
      13sb.Append( '3',64 );//添加一個字符串
      14Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      15Console.WriteLine( "\t Length:" + sb.Length );
      16
      17//注意這里:如果你取消Remove這步操作,將會引發(fā)ArgumentOutOfRangeException異常,因為當(dāng)前容量小于
      18
      19//Length,這在自己控制StringBuilder的時候務(wù)必要注意容量溢出的問題
      20
      21sb.Remove(0,sb.Length);//移出全部內(nèi)容,再測試
      22sb.Capacity = 1;//重新定義了容量
      23sb.Append( 'a',2 );
      24Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      25Console.WriteLine( "\t Length:" + sb.Length );
      26
      27sb.Append( 'b',4 );
      28Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      29Console.WriteLine( "\t Length:" + sb.Length );
      30
      31sb.Append( 'c',6 );
      32Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      33Console.WriteLine( "\t Length:" + sb.Length
      上面的代碼輸出的結(jié)果:
      1Capacity:16     Length:0    //輸出第一次,默認(rèn)的Capacity是16
      2Capacity:32     Length:17    //第二次,我們故意添加了17個字符,于是Capacity=Capacity*2
      3Capacity:64     Length:49    //繼續(xù)超出,則Capacity=Capacity*2
      4Capacity:128     Length:113
      5Capacity:3     Length:2    //清空內(nèi)容后,設(shè)置Capacity=1,重新添加了字符
      6Capacity:7      Length:6    //后面的結(jié)果都類似
      7Capacity:14     Length:12
      從上面的代碼和結(jié)果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認(rèn)的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
      >= Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結(jié)果,就可以推斷出Capacity的公式:
      if ( Capacity < Length && Capacity > 0 ){
            Capacity *= 2;
      }

       1System.Text.StringBuilder sb = new
      System.Text.StringBuilder();//初始化一個StringBuilder
       2Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       3Console.WriteLine( "\t Length:" + sb.Length );
       4
       5sb.Append( '1',17 );//添加一個字符串,這里故意添加17個字符,是為了看到Capacity是如何被擴充的
       6Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       7Console.WriteLine( "\t Length:" + sb.Length );
       8
       9sb.Append( '2',32 );//添加一個字符串
      10Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      11Console.WriteLine( "\t Length:" + sb.Length );
      12
      13sb.Append( '3',64 );//添加一個字符串
      14Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      15Console.WriteLine( "\t Length:" + sb.Length );
      16
      17//注意這里:如果你取消Remove這步操作,將會引發(fā)ArgumentOutOfRangeException異常,因為當(dāng)前容量小于
      18
      19//Length,這在自己控制StringBuilder的時候務(wù)必要注意容量溢出的問題
      20
      21sb.Remove(0,sb.Length);//移出全部內(nèi)容,再測試
      22sb.Capacity = 1;//重新定義了容量
      23sb.Append( 'a',2 );
      24Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      25Console.WriteLine( "\t Length:" + sb.Length );
      26
      27sb.Append( 'b',4 );
      28Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      29Console.WriteLine( "\t Length:" + sb.Length );
      30
      31sb.Append( 'c',6 );
      32Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      33Console.WriteLine( "\t Length:" + sb.Length
      上面的代碼輸出的結(jié)果:
      1Capacity:16     Length:0    //輸出第一次,默認(rèn)的Capacity是16
      2Capacity:32     Length:17    //第二次,我們故意添加了17個字符,于是Capacity=Capacity*2
      3Capacity:64     Length:49    //繼續(xù)超出,則Capacity=Capacity*2
      4Capacity:128     Length:113
      5Capacity:3     Length:2    //清空內(nèi)容后,設(shè)置Capacity=1,重新添加了字符
      6Capacity:7      Length:6    //后面的結(jié)果都類似
      7Capacity:14     Length:12
      從上面的代碼和結(jié)果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認(rèn)的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
      >= Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結(jié)果,就可以推斷出Capacity的公式:
      if ( Capacity < Length && Capacity > 0 ){
            Capacity *= 2;
      }

       1System.Text.StringBuilder sb = new
      System.Text.StringBuilder();//初始化一個StringBuilder
       2Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       3Console.WriteLine( "\t Length:" + sb.Length );
       4
       5sb.Append( '1',17 );//添加一個字符串,這里故意添加17個字符,是為了看到Capacity是如何被擴充的
       6Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
       7Console.WriteLine( "\t Length:" + sb.Length );
       8
       9sb.Append( '2',32 );//添加一個字符串
      10Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      11Console.WriteLine( "\t Length:" + sb.Length );
      12
      13sb.Append( '3',64 );//添加一個字符串
      14Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      15Console.WriteLine( "\t Length:" + sb.Length );
      16
      17//注意這里:如果你取消Remove這步操作,將會引發(fā)ArgumentOutOfRangeException異常,因為當(dāng)前容量小于
      18
      19//Length,這在自己控制StringBuilder的時候務(wù)必要注意容量溢出的問題
      20
      21sb.Remove(0,sb.Length);//移出全部內(nèi)容,再測試
      22sb.Capacity = 1;//重新定義了容量
      23sb.Append( 'a',2 );
      24Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      25Console.WriteLine( "\t Length:" + sb.Length );
      26
      27sb.Append( 'b',4 );
      28Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      29Console.WriteLine( "\t Length:" + sb.Length );
      30
      31sb.Append( 'c',6 );
      32Console.Write( "Capacity:" + sb.Capacity );//這里的Capacity會自動擴大
      33Console.WriteLine( "\t Length:" + sb.Length
      上面的代碼輸出的結(jié)果:
      1Capacity:16     Length:0    //輸出第一次,默認(rèn)的Capacity是16
      2Capacity:32     Length:17    //第二次,我們故意添加了17個字符,于是Capacity=Capacity*2
      3Capacity:64     Length:49    //繼續(xù)超出,則Capacity=Capacity*2
      4Capacity:128     Length:113
      5Capacity:3     Length:2    //清空內(nèi)容后,設(shè)置Capacity=1,重新添加了字符
      6Capacity:7      Length:6    //后面的結(jié)果都類似
      7Capacity:14     Length:12
      從上面的代碼和結(jié)果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認(rèn)的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
      >= Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結(jié)果,就可以推斷出Capacity的公式:
      if ( Capacity < Length && Capacity > 0 ){
            Capacity *= 2;
      }
      OK..看到公式就明白了..StringBuilder是以當(dāng)前的Capacity*2來擴充的..所以,在使用StringBuilder需要特別注意,尤其是要拼接或追加N多字符的時候,要注意技巧的使用,可以適當(dāng)?shù)?有預(yù)見性的設(shè)置Capacity的值,避免造成過大內(nèi)存的浪費,節(jié)約無謂的內(nèi)存空間..例如,下列代碼就可以根據(jù)情況自動的擴展,而避免了較大的內(nèi)存浪費.

       1System.Text.StringBuilder sb = new System.Text.StringBuilder();
       2int i = 0;
       3long StartTime  = DateTime.Now.Ticks;
       4while ( i < 100000 ) {
       5sb.Append( i.ToString() );
       6i++;
       7}
       8long EndTime  = DateTime.Now.Ticks;
       9
      10Console.WriteLine( "時間:" + ( EndTime-StartTime ) + "\t Capacity:"+ sb.Capacity
      + "\t Length:"
      11
      12+ sb.Length);
      13
      14System.Text.StringBuilder sb1 = new System.Text.StringBuilder();
      15i = 0;
      16StartTime  = DateTime.Now.Ticks;
      17while ( i < 100000 )
      18{
      19if ( sb1.Capacity <= sb1.Length )//先判斷是否>Length
      20sb1.Capacity += 7;//這里一定要根據(jù)情況的增加容量,否則會有性能上的消耗
      21sb1.Append( i.ToString() );
      22i++;
      23}
      24EndTime  = DateTime.Now.Ticks;
      25
      26Console.WriteLine( "時間:" + ( EndTime-StartTime ) + "\t Capacity:"+
      sb1.Capacity + "\t
      27
      28Length:" +
      sb1.Length);需要特別說明的一點是,自動增加的容量,一定要根據(jù)實際預(yù)見的情況而改變,否則不但起不到優(yōu)化的作用,反而會影響到程序的性能..


      另外,如果有時間的話,可以測試一下下面的代碼,用string和StringBuilder拼接字符串的區(qū)別..你會嚇到的!!

       1System.Text.StringBuilder sb = new System.Text.StringBuilder();
       2int i = 0;
       3long StartTime  = DateTime.Now.Ticks;
       4while ( i < 100000 ) {
       5sb.Append( i.ToString() );
       6i++;
       7}
       8long EndTime  = DateTime.Now.Ticks;
       9
      10Console.WriteLine( "時間:" + ( EndTime-StartTime ) );
      11
      12string sb1 = null;
      13i = 0;
      14StartTime  = DateTime.Now.Ticks;
      15while ( i < 100000 )
      16{
      17sb1 += i;
      18i++;
      19}
      20EndTime  = DateTime.Now.Ticks;
      21Console.WriteLine( "時間:" + ( EndTime-StartTime ));

      來自: http://hi.baidu.com/xdyk/blog/item/83ce979486af2f1ed31b703a.html

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多