c# string
阿新 • • 發佈:2017-09-07
prototype string對象 service names tr1 連續 pin lin ace
string最為顯著的一個特點就是它具有恒定不變性:我們一旦創建了一個string,在managed heap 上為他分配了一塊連續的內存空間,我們將不能以任何方式對這個string進行修改使之變長、變短、改變格式。所有對這個string進行各項操作(比如調用ToUpper獲得大寫格式的string)而返回的string,實際上另一個重新創建的string,其本身並不會產生任何變化。
string 對象稱為不可變的(只讀),因為一旦創建了該對象,就不能修改該對象的值。有的時候看來似乎修改了,實際是string經過了特殊處理,每次改變值時都會建立一個新的string對象,變量會指向這個新的對象,而原來的還是指向原來的對象,所以不會改變。這也是string效率低下的原因。
class Program { string str = "class.str"; private int i = 0; static void StringConvert(string str) { str = "string being converted"; } static void StringConvert(Program c) { c.str = "string being converted"; } static void Add(int i) { i++; } static void AddWithRef(ref int i) { i++; } static void Main(string[] args) { int i1 = 10; int i2 = 20; string str = "str"; Program c = new Program(); Add(i1); AddWithRef(ref i2); Add(c.i); StringConvert(str); StringConvert(c); Console.WriteLine(i1); Console.WriteLine(i2); Console.WriteLine(c.i); Console.WriteLine(str); Console.WriteLine(c.str); Console.ReadLine(); } } 輸出: 10 21 0 str string being converted
using System.Runtime.InteropServices; using System; namespace ConsolePrototype { public class A { public string str1 = "aaa"; public string str2 = "aaa"; } public class B { public string str1 = "aaa"; } class Program { static void Main(string[] args) { A a = new A(); GCHandle hander = GCHandle.Alloc(a.str1); var pin = GCHandle.ToIntPtr(hander); GCHandle hander2 = GCHandle.Alloc(a.str2); var pin2 = GCHandle.ToIntPtr(hander); B b = new B(); GCHandle hander3 = GCHandle.Alloc(b.str1); var pin3 = GCHandle.ToIntPtr(hander3); Console.WriteLine(pin); Console.WriteLine(pin2); Console.WriteLine(pin3); Console.ReadLine(); } } }
c# string