有关C# String类型究竟是值类型还是引用类型,在很多C#学习者中都或多或少造成过困惑。好比下面这个例子:
- class Class1
- {
- static void StrChange(string str)
- {
- str = "hellow";
- }
- static void Main()
- {
- string str = "123";//申明一个字符串
- StrChange(str);//调用方法
- Console.WriteLine(str);//输出字符串
- }
- }
输出的结果是 "123" 。
那么,string 到底是值类型还是引用类型?有人会说,如果是值类型,结果倒还说的过去.但是string 的定义不是应该是引用类型么?如果是引用类型的话.输出的结果难度不应该是: "hellow"么?
解答这个问题的关键在于,C# string类型是特殊的引用类型,它的实例是只读的。这个地方要搞清楚语法和实现的区别 。在C#的语法中,
◆static void StrChange(string str) 是值传递
◆static void StrChange(ref string str) 是引用传递
但在实现上,static void StrChange(string str) 这种值传递,在函数体内对str进行修改之前,与函数外部的变量指向同一块内存,是“引用”传递,但在函数体内对str修改后,就会触发对该str重新分配一块内存。
所以说,String 是引用类型,不过是不可变的。对字符串做一些操作(比如大小写的转换、+=), 实际上是重新创建了一个字符串。这也是为什么在做大量字符串拼接的时候要使用StringBuilder 而不用+=。
有关C# String类型做为引用类型的特别之处,可以参看下例的示例及注释:
- private void button2_Click(object sender, EventArgs e)
- {
- string str="aaa";
- string str1 = str;
- str = "bbb";//注释掉此名就"yes",否则"no".这就说明str重新赋值的时候,
- //其实是重新创建了一个名为str的字符串(内存中指向的位置是不同的),先前
- //的那个str你就再也看不到了.
- string str2 = str;
- if (object.ReferenceEquals( str1,str2))
- {
- MessageBox.Show("yes");
- }
- else
- {
- MessageBox.Show("no");
- }
- }
最后回到一开始的那段代码。如果想下面这样编写:
- class Class1
- {
- static string StrChange(string str)
- {
- str = "hellow";
- return str;
- }
- static void Main()
- {
- string str = "123";//申明一个字符串
- str=StrChange(str);//调用方法
- Console.WriteLine(str);//输出字符串
- }
- }
这样输出的便是hellow了。
【编辑推荐】