none
值类型ref引用传递 和 装箱有联系么? RRS feed

  • 问题

  • //例一:
    
    int i = 5 ;
    
    change(ref i) ;
    
    //由于ref关键字,传递的则是参数的引用,
    
    //change方法改变了外部i的值
    
    print(i) ;//100
    
    void change(ref int val){
    
    val = 100;
    
    } 
    
    
    
    
    //例二:值类型的装箱操作。
    
    int j = 5 ;
    
    object o = j ;
    
    //改变的是托管堆上的对象。
    
    o = 100; 
    
    print(o) ;//100 
    
    pring(j) ;//5
    
    
    
    

    困惑:CLR via C# 中文版 121  有这样一段话:如果要获取对值类型的一个实例的引用,该实例就必须装箱。

           按照这句话的意思,在例一中,因为要传递 i 的引用地址,那么就应该对i进行装箱操作,再结合例二,那么在   

           change方法中改变参数的值 ,应该对外界的 i 无影响才对 ,即pring(i)打印的结果应该为5而不是100。 

           而ref传递时是有影响的,修改的就是外界参数的值 ,所以正确的结果应该是打印100  。这两者好像有点矛盾?

           如果ref引用传递时没有发生装箱,那么又是如何获取参数的引用的呢?





    2011年5月16日 12:34

答案

  • 您好:
    ref只是相当于C或者C++的指针概念。通过引用内存单元的一个地址,简介读取里边内容进行改写。

    而“装箱”和“拆箱”是“值类型”和“引用类型”之间相互转化——object obj = 某个int(要装箱啊,因为把值类型赋值给引用类型,两者类型不一样!)

    但是你的:

    void change(ref int val){

    val = 100;

    }

    val还是值类型,此时值类型自己改变自己,不存在拆箱装箱问题


    如果你有其它意见或私下交流,请发送邮件到:maledong@qq.com;或者请QQ我
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    • 已标记为答案 iLove_ 2011年5月17日 7:14
    2011年5月17日 6:26
    版主

全部回复

  • 建议去复习一下指针吧。。ref 实际上就是取地址。

     

    如果是 ref int 就是获得一个指向 int 类型的指针; ref object 就是一个指向指针的指针。


    学习学习....
    2011年5月17日 5:44
  • 您好:
    ref只是相当于C或者C++的指针概念。通过引用内存单元的一个地址,简介读取里边内容进行改写。

    而“装箱”和“拆箱”是“值类型”和“引用类型”之间相互转化——object obj = 某个int(要装箱啊,因为把值类型赋值给引用类型,两者类型不一样!)

    但是你的:

    void change(ref int val){

    val = 100;

    }

    val还是值类型,此时值类型自己改变自己,不存在拆箱装箱问题


    如果你有其它意见或私下交流,请发送邮件到:maledong@qq.com;或者请QQ我
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    • 已标记为答案 iLove_ 2011年5月17日 7:14
    2011年5月17日 6:26
    版主