一、string的确是引用类型
常规上是这样定义的:
string是引用类型,但是其又具有值类型的一些特性。
- static void Main(string[] args)
- {
- string str1 = "I am a number";
- string str2 = str1;
- Console.WriteLine("str1 = " + str1);
- Console.WriteLine("str2 = " + str2);
-
- str1 = "I am another number";
- Console.WriteLine("after str1 changed... str1 = " + str1);
- Console.WriteLine("after str1 changed... str2 = " + str2);
-
- Console.WriteLine("-------------------------------------------");
- Console.WriteLine(str1);
- Send(str1);
-
- Console.ReadLine();
- }
-
- static void Send(string str)
- {
- str = str + "1";
- Console.WriteLine(str);
- }
图1
由图1可以总结出下面几点:
1、string的引用特性
(1)引用给引用赋值,是将两个引入都同指向同一片内存,并没有开发新的内存。
str2=str1,这样大家都指向了”I am a number”所在的内存,并没有新开辟一片内存。
(2)字符串给引用赋值,新开辟了一块内存,并让引用指向该内存。
2、string的值特性说明
(1)、使用引用传参数,是传值调用。
在函数中传递string(比如函数参数是string型)时,传递的是地址,但却不能修改成员变量,原因是它重新又创建了一个全新的对象,和它想修改的那个成员变量非同一地址,所以看上去像是值类型;
(2)、对一些类对象进行浅拷贝时,string类型也能够被复制。
主要原因是string类型定义中的一段解释:
- // 表示空字符串。此字段为只读。
- public static readonly string Empty;
另外,str1 == str2 ,仅仅是比较了值,而非地址(是MS重写了==运算符所致).
二. ”@”在string中的用法
都知道如果要使用转义字符的话,需要在字符前加上”\”,而C#提供了一种新的机制,使用”@”.在”@”后的字符串都看作是原意,不会解释为转义字符串.并且以”@”开头的字符串支持回车换行的显示方式(见下例).不过会增加到字符串长度,不推荐过多使用.
参考并修改博客:
http://www.cnblogs.com/tling091223/archive/2009/12/23/1630338.html