C#的string

string的定义

string 是引用类型,在栈上保持引用,在堆上(确切地说:是在字符串区)保持数据。

public sealed class String : IComparable, ICloneable, IConvertible, 
IComparable<String>, IEnumerable<char>, IEnumerable, 
IEquatable<String>

string的不可变性

string创建的字符串实际上是一个不可变的数据类型,一旦字符串对象进行了初始化,改字符串的内容就不能改变了,当创建a后,给a进行a+“456”操作,实际上是又创建了一个“123456”的新字符串,然后让a的引用地址指向新的字符串。

        static void Main(string[] args)
        {
            string a = "123";
            string b = a;
            Console.WriteLine(object.ReferenceEquals(a,b));//True
            a = a + "456";
            Console.WriteLine(object.ReferenceEquals(a, b));//False
            Console.Read();
        }

创建新string

对字符串进行赋值操作时,会在字符串区寻找该值是否已经存在,若存在,就将引用指向它;若不存在,则创建新的字符串,然后将引用指向它

string a = "123";
string b = "123";           
Console.WriteLine(object.ReferenceEquals(a,b));//打印结果为true

字符串交换

字符串a与字符串b传入Swap函数是将a、b的地址复制了一份给s1、s2,在Swap函数中s1与s2的地址交换了位置,但不会影响a,b的引用地址

  static void Main(string[] args)
        {
            string a = "123";
            string b ="456";
            Swap(a, b);
            Console.WriteLine("a:{0},b:{1}", a, b);//a:123,b:456
            Console.ReadKey();
        }
        static void Swap(string s1,string s2)
        {
            string temp = s1;//temp->s1->a
            s1 = s2;//s1->s2->b
            s2 = temp;//s2->tmp->s1->a
            Console.WriteLine("s1:{0},s2:{1}", s1, s2);//s1:456,s2:123
        }

string作为函数的参数

string类型的数据作为函数的参数进行运算时,会将ao的引用地址复制给函数参数a,在函数内部对参数a进行字符串赋值时,相当于创建了一个新的字符串“Hello Word”,并将此字符串的地址赋值给了参数a,实际上参数a在这种操作过程中,引用地址发生了改变,并没有影响函数外部ao的值。

      static void Main(string[] args)
        {
            string ao = "Hello ";
            Add(ao);
            Console.WriteLine("函数外部ao:{0}", ao);//仍然是Hello 
            Console.ReadKey();
        }
       static void Add(string a)
        {
            string b=a;
            a += " Word!";
           Console.WriteLine(object.ReferenceEquals(a,b));//打印结果为false
            Console.WriteLine("函数内部a:{0}", a);//打印出Hello Word
        }
        

stringBuilder

static void Main(string[] args)
        {
            StringBuilder stringBuilder = new StringBuilder("123");
            stringBuilder.Append("456");
            StringBuilder stringBuilder2 = new StringBuilder(20);//初始化一个空的stringBuilder对象,站20个字符
            Console.Read();
        }

猜你喜欢

转载自blog.csdn.net/weixin_41707267/article/details/83990117