码迷,mamicode.com
首页 > 其他好文 > 详细

C#中string的小结

时间:2014-09-29 15:45:51      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   sp   div   问题   c   log   

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对象后,可以改变原始值。

C#中string的小结

标签:style   blog   color   使用   sp   div   问题   c   log   

原文地址:http://www.cnblogs.com/warnet/p/4000193.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!