黑马程序员技术交流社区

标题: 关于string类型交换两个变量值得问题 [打印本页]

作者: 高腾    时间: 2013-6-14 07:39
标题: 关于string类型交换两个变量值得问题
本帖最后由 高腾 于 2013-6-15 14:14 编辑

string类型本来就是引用类型,但是使用下面的ExcVal方法却不能交换两个变量的值
  1. 01.class Program

  2. 02.    {

  3. 03.        static void Main(string[] args)

  4. 04.        {

  5. 05.            string s1 = "123";

  6. 06.            string s2 = "244";

  7. 07.            ExcVal(s1,s2);

  8. 08.            Console.WriteLine("{0},{1}", s1, s2);

  9. 09.            Console.ReadKey();

  10. 10.

  11. 11.        }

  12. 12.

  13. 13.        static void ExcVal(string s1,string s2)

  14. 14.        {

  15. 15.            string temp = s1;

  16. 16.            s1 = s2;

  17. 17.            s2 = temp;

  18. 18.        }

  19. 19.    }
复制代码
但是如果在参数前面加上ref,就可以交换两个变量的值

重点是:ref的作用就是传递引用,string类型本来就是引用类型,为什么不能交换值?(
之前发错地儿了)


作者: 许庭洲    时间: 2013-6-14 08:58
String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作没意义.因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象
作者: 彭康    时间: 2013-6-14 09:47
01.class Program

02.    {

03.        static void Main(string[] args)

04.        {

05.            string s1 = "123";开辟内存S1(名字为了让你看起来更清楚)放入"123";

06.            string s2 = "244";开辟内存S2(名字为了让你看起来更清楚)放入"244";

07.            ExcVal(s1,s2);//传入方法

08.            Console.WriteLine("{0},{1}", s1, s2);

09.            Console.ReadKey();

10.

11.        }

12.

13.        static void ExcVal(string s1,string s2)

14.        {

15.            string temp = s1;//temp 指针指向S1内存地址

16.            s1 = s2;//S1指针指向S2内存地址

17.            s2 = temp;//S1 指针指向temp内存地址(原S1)

18.        }//加上ref 使得方法2个方法内的变量指针始终相同

19.    }

作者: 陈壹    时间: 2013-6-14 13:18
无关于不能交换值的问题,在你式子中Main方法中的s1,s2跟ExcVal中的s1,s2都属于局部变量,彼此之间相对独立,虽然ExcVal中的参数来源于Main但是,ExcVal却无法对Main方法中的程序进行改变,因为它没有返回值。参数前加ref的意义是返回参数,把两个同名局部变量相关联,使它们的指针指向同一个内存空间地址。
作者: popoluno    时间: 2013-6-14 14:15
参数前加ref的意义是返回参数,和你说的问题是两码事
作者: yangaidongcumt    时间: 2013-6-15 19:14
因为字符串的不变性~~~~~
作者: 高腾    时间: 2013-6-15 19:26
yangaidongcumt 发表于 2013-6-15 19:14
因为字符串的不变性~~~~~

这里的交换只是交换内存指针吧
如果按你说的那样,使用ref也不会交换值
作者: 关关雎鸠    时间: 2013-6-15 20:39
ref的存在就是表示引用传递,没有就表示值传递。那么在没有ref的时候,不管是引用类型还是值类型,都是只传递值过去。

而方法里面的其实是再次定义了一个新的变量,跟之前的没有任何关系。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2