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