2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

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

 orion360doc 2011-02-16

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


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

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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

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


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

 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( "時(shí)間:" + ( 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( "時(shí)間:" + ( EndTime-StartTime ));

來(lái)自: http://hi.baidu.com/xdyk/blog/item/83ce979486af2f1ed31b703a.html

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多