C# 拼接字符串的幾種方式和性能


開發過程中常用到的拼接字符串的方法有三種:

  1 簡單 “+=” 拼接法

    

1
2
3
4
5
string  str= "a" ;
 
str+= "c" + "d" ;
 
string  str_1= "a" + "b" ;

  

  首先需要明白的是string類型,string是引用類型,保留在堆上,而不是棧上,用的時候傳的是內存中的地址,每次修改就會重新創建一個新的string對象來存儲字符串,原有的會被自動回收。

  第一種方式的實現原理,第一步先在內存中分配空間,存儲str變量的對象,值為"a", “+=”時,又會重新創建一個對象來存儲新的字符串(“abc"),把str指向這個新的地址。所以只有簡單幾步的拼寫時,一般不會有太大問題,如果有時候需要循環拼接時,就會不斷創建新的對象,很浪費性能和內存。

  2 String.Format()

 

1
string  str= String.Format( "{0}{1}{2}" , "a" , "b" , "c" );

  

  這就需要先看看他的源代碼了,

1
2
3
4
5
6
7
public  static  String Format(IFormatProvider provider, String format,  params  Object[] args) <br>{
     if  (format ==  null  || args ==  null )
       throw  new  ArgumentNullException((format== null )? "format" : "args" );
    StringBuilder sb =  new  StringBuilder(format.Length + args.Length * 8);
    sb.AppendFormat(provider,format,args);
     return  sb.ToString();
}

  可以看到是先創建一個StringBuilder類型的變量,長度為第一個參數的長度+參數長度的8倍。.Net自動分配一個比較大的容量來存儲。StringBuilder的介紹請看第3種方法.

  這種方式的代碼看起來比較整潔,易於月度,效率也比+=高效很多。

3 StringBuilder.Append

 

1
2
3
StringBuilder str= new  StringBuilder();
 
str.Append( "a" );

  

   StringBuilder 是預先創建一個比較大的內存,以后每次操作時判斷容量上限是否不夠用,如果不夠用就自動把容量擴大一倍,修改的還是第一次創建的對象的值。

 

如果是簡單的拼寫時,可以用 "+=", string.format

循環內拼寫很長的字符串時,就需要用到StringBuilder來節省性能和內存了。

 

c# 中 $符號的用法   C# 6.0的、、、VS 2015支持

C#中$的用法:是為了替代string.format();原先賦值需要占位符和變量,當需要拼接多個變量會造成語句過長等不易理解問題,$""是為了替代string.format(),可以把字符串中的C#變量{}包含起來達到識別C#變量的目的$"{id}";也支持表達式,使用$"{(你的表達式)}"

 

[csharp]  view plain  copy
 
  1. var k = "a";  
  2.  var a0 = "User";  
  3.  var a1 = "Id";  
  4.  var a2 = 5;  
  5.  var ccc = string.Format("select * from {0} where {1} = {2}", a0, a1, a2);  
  6.  var ccb = $"select * from {a0} where {a1}={a2}";  

 

 

 

當然也支持string.format()里面的格式,如:

 

[csharp]  view plain  copy
 
    1. var k = "a";  
    2. var k4 = $"{k,5}";  
    3. var k3 = string.Format("{0,5}", k);  
    4.   
    5. var k2 = DateTime.Now;  
    6. var c = $"{k2:yyyy}";  
    7. c = string.Format("{0:yyyy}", k2);  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM