A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高腾 中级黑马   /  2013-6-14 07:39  /  2292 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高腾 于 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类型本来就是引用类型,为什么不能交换值?(
之前发错地儿了)

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

7 个回复

正序浏览
ref的存在就是表示引用传递,没有就表示值传递。那么在没有ref的时候,不管是引用类型还是值类型,都是只传递值过去。

而方法里面的其实是再次定义了一个新的变量,跟之前的没有任何关系。
回复 使用道具 举报 1 0
高腾 中级黑马 2013-6-15 19:26:10
7#
yangaidongcumt 发表于 2013-6-15 19:14
因为字符串的不变性~~~~~

这里的交换只是交换内存指针吧
如果按你说的那样,使用ref也不会交换值
回复 使用道具 举报
因为字符串的不变性~~~~~
回复 使用道具 举报
参数前加ref的意义是返回参数,和你说的问题是两码事
回复 使用道具 举报
无关于不能交换值的问题,在你式子中Main方法中的s1,s2跟ExcVal中的s1,s2都属于局部变量,彼此之间相对独立,虽然ExcVal中的参数来源于Main但是,ExcVal却无法对Main方法中的程序进行改变,因为它没有返回值。参数前加ref的意义是返回参数,把两个同名局部变量相关联,使它们的指针指向同一个内存空间地址。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
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.    }

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作没意义.因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马