1. 程式人生 > >c# string

c# string

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