c# string

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();
            }
        }
    }

 

posted @ 2017-09-07 17:09  二哥(阿伟)  阅读(217)  评论(0编辑  收藏  举报