C#中string的小结

C#中的string类型明确定义为引用类型,但是使用时常常表现出数值型的特性。最典型的例子就是交换字符串。

 1         public static void stringexchange(string a, string b)
 2         {
 3             string c = a;
 4             a = b;
 5             b = c;
 6         }
 7         public static void stringexchange(ref string a, ref string b)
 8         {
 9             string c = a;
10             a = b;
11             b = c;
12         }

很明显地,如果想要实现字符串交换,需要使用第二种实现。可是,string不是引用类型吗?为什么在函数内交换了,在函数外并没有发生改变呢?要理解这个问题,我们需要以下两点基础:

string是引用类型,应该做这样的理解。语句”string a = "abc";“其实是创建了一个string的实例对象"abc",并且让引用a指向了这个对象。同时,对象"abc",也就是一个string对象是不可改变的,这一点是C#语言上设计决定的;任何对对象的改变,其实都是创建了新的string对象,并且让引用指向了那个对象。

string虽然是引用,但是在作为方法的参数传递时,这个引用本身发生了值传递。也即是说,在方法内部,操作的其实是这个引用的副本——但是,两个引用是指向同一内存空间的。

有了以上的准备,就好理解这个问题了。string传递了一个引用的副本给方法,方法在内部对引用做了修改,但是由于引用指向的string对象是不可以修改的,所以运行时会创建新的string对象,并且让内部的引用的副本指向新的对象。而这一切都跟外部的原始引用没有关系。所以,外部的string对象自然也就没有改变。在第二种实现中,因为使用了ref关键字,我们操作的实际上就是原始的引用,因此,在方法内部让它指向新的string对象后,可以改变原始值。

posted @ 2014-09-29 14:35  warnet  阅读(219)  评论(0编辑  收藏  举报