C#基礎概念之P/Invoke,StringBuilder 和 String
系列文章導航:
C#基礎概念之P/Invoke,StringBuilder 和 String
21.P/Invoke是什么?
答:
在受控代碼與非受控代碼進行交互時會產生一個事務(transition) ,這通常發生在使用平臺調用服務(Platform Invocation Services),即P/Invoke
如調用系統的 API 或與 COM 對象打交道,通過 System.Runtime.InteropServices 命名空間
雖然使用 Interop 非常方便,但據估計每次調用事務都要執行 10 到 40 條指令,算起來開銷也不少,所以我們要盡量少調用事務
如果非用不可,建議本著一次調用執行多個動作,而不是多次調用每次只執行少量動作的原則
22.StringBuilder 和 String 的區別?
答:
String 在進行運算時(如賦值、拼接等)會產生一個新的實例,而 StringBuilder 則不會。所以在大量字符串拼接或頻繁對某一字符串進行操作時最好使用 StringBuilder,不要使用 String
另外,對于 String 我們不得不多說幾句:
1.它是引用類型,在堆上分配內存
2.運算時會產生一個新的實例
3.String 對象一旦生成不可改變(Immutable)
4.定義相等運算符(== 和 !=)是為了比較 String 對象(而不是引用)的值
示例:
Code using System; using System.Collections.Generic; using System.Text; namespace Example22 { class Program { static void Main(string[] args) { const int cycle = 10000; long vTickCount = Environment.TickCount; String str = null; for (int i = 0; i < cycle; i++) str += i.ToString(); Console.WriteLine("String: {0} MSEL", Environment.TickCount - vTickCount); vTickCount = Environment.TickCount; //看到這個變量名我就生氣,奇怪為什么大家都使它呢? :) StringBuilder sb = new StringBuilder(); for (int i = 0; i < cycle; i++) sb.Append(i); Console.WriteLine("StringBuilder: {0} MSEL", Environment.TickCount - vTickCount); string tmpStr1 = "A"; string tmpStr2 = tmpStr1; Console.WriteLine(tmpStr1); Console.WriteLine(tmpStr2); //注意后面的輸出結果,tmpStr1的值改變并未影響到tmpStr2的值 tmpStr1 = "B"; Console.WriteLine(tmpStr1); Console.WriteLine(tmpStr2); Console.ReadLine(); } } }
結果:
String: 375 MSEL
StringBuilder: 16 MSEL
A
A
B
A
全站熱搜