標籤:one build uil 構造 沒有 記憶體回收 ble new 系統
#1 :在.Net Framework中,字元總是表示成16位Unicode的代碼
#2 :String 和string 其實是一樣的只是表現形式上不同
#3 :string類型被視為基元類型,也就是編譯器允許在原始碼中直接使用字面值表示字串,編譯器將這些字串放到模組的中繼資料中,並在運行時載入和引用它們。
1 static void Main(string[] args)2 {3 string s = "2";4 Console.WriteLine(s);5 Console.ReadLine();6 }
il查看如下:
1 .method private hidebysig static void Main(string[] args) cil managed 2 { 3 .entrypoint 4 // 代碼大小 21 (0x15) 5 .maxstack 1 6 .locals init ([0] string s) 7 IL_0000: nop 8 IL_0001: ldstr "2" 9 IL_0006: stloc.010 IL_0007: ldloc.011 IL_0008: call void [mscorlib]System.Console::WriteLine(string)12 IL_000d: nop13 IL_000e: call string [mscorlib]System.Console::ReadLine()14 IL_0013: pop15 IL_0014: ret16 } // end of method Program::Main
IL指令構造對象的新執行個體是newobj 上面的IL中並沒有newobj IL為 ldstr 也就是CLR 用一種特殊的方式構造了string對象
#4:string 中的 + 操作符的實質
1 static void Main(string[] args)2 {3 string s = "2"+"3";4 Console.WriteLine(s);5 Console.ReadLine();6 }
如果所有的字串是字面值,則編譯器在編譯時間串連它們,最終只有一個字串"23",對於非字面值的字串使用+操作符,串連則在運行時進行,對於運行時串連不要使用+操作符,這樣會在堆上建立多個字串對象,堆是需要記憶體回收的,對效能有影響,對於這種應使用stringbuilder
#5:字串是不可變的
string對象一旦建立便不能更改
1 static void Main(string[] args) 2 { 3 string s = "2"; 4 Console.WriteLine(s); 5 ChangeStr(s); 6 Console.ReadLine(); 7 } 8 private static void ChangeStr(string s) 9 {10 s = "1";11 }12 213 2
IL代碼:
.method private hidebysig static void ChangeStr(string s) cil managed{.method private hidebysig static void Main(string[] args) cil managed{ .entrypoint // 代碼大小 35 (0x23) .maxstack 1 .locals init ([0] string s) IL_0000: nop IL_0001: ldstr "2" IL_0006: stloc.0 IL_0007: ldloc.0 IL_0008: call void [mscorlib]System.Console::WriteLine(string) IL_000d: nop IL_000e: ldloc.0 IL_000f: call void ConsoleApp2.Program::ChangeStr(string) IL_0014: nop IL_0015: ldloc.0 IL_0016: call void [mscorlib]System.Console::WriteLine(string) IL_001b: nop IL_001c: call string [mscorlib]System.Console::ReadLine() IL_0021: pop IL_0022: ret} // end of method Program::Main // 代碼大小 9 (0x9) .maxstack 8 IL_0000: nop IL_0001: ldstr "1" IL_0006: starg.s s IL_0008: ret} // end of method Program::ChangeStr
雖然string是個對象存放在堆上,但它並不像其他的應用對象一樣對它的改變直接反應,通過上面的代碼我們的可以發現CLR為每個字串都建立了對象,這樣做的好處:字串不可變,則操作或訪問字串時不會發生線程同步問題,CLR可通過共用多個完全一致的string內容,這樣減少了系統中字串數量 從而節省記憶體。
#6 :安全字串
對於一些敏感性資料我們可以使用System.Security.SecureString 該類實現了IDisposable 使用完後可以進行銷毀,防止資料的泄露。
C# String 字串一些關鍵理解