引用类型包括:
-
String
-
所有数组,即使其元素是值类型
-
类类型,如 Form
-
委托
参考 http://msdn.microsoft.com/zh-cn/library/t63sy5hs(VS.80).aspx
既然msdn上说string是引用类型,那么我们就用一段代码验证一下。
class Program
{
static void Main(string[] args)
{
string str = "abc";
TestFun(str);
Console.WriteLine(str);
Console.ReadLine();
}
private static void TestFun(string strVal)
{
strVal = "hello";
}
}
运行结果:
按一般引用类型的规律,str会被改成hello,然后输出结果为 hello。
下面我们来分析一下其中的原因。
首先,参数传入函数的默认行为时按值传递。数据的副本会被传入函数,也就是str(地址)的副本回复制给strVal,strVal指向的地址发生改变不会影响到str。
然后,System.String 一个有趣的方面是,一旦将初始值给字符串对象,字符串数据就不能改变了。当改变字符串内容时,托管堆上会加载一个新的字符串对象,之前包含的字符串对象最终会被垃圾回收。
那么,也就是说,strVal在函数内部修改了自己的指向地址,而这种改变不会影响str。所以,str值不会像一般的引用类型那样被改变。