class PassingValByRef 
    {  static void SquareIt(ref int x)  
        {  
           x*=x; 
           Console.WriteLine("{0}",x);  
         } 
        public static void Main()
        {  
            int myInt=5; 
            Console.WriteLine("{0}",  myInt);  
            SquareIt(ref myInt);
            Console.WriteLine("{0}",  myInt);
            Console.ReadKey();
        } 
    } 
输出结果是5、25、25
ref到底是啥用法啊,请教,看书,也生硬,不太懂,能不能通俗易懂的

解决方案 »

  1.   

    ref就是引用  
    由于int是值类型, 在方法参数传递int的时候是一个拷贝的过程 
    如果不用ref,你的Main函数中的myInt和SquareIt函数中的x完全就是2个不同的对象,不管你SquareIt函数中的x怎么变化,Main函数中的myInt是不会变的。
    但是加了ref就不一样了,那就是不是拷贝,而是传递地址,地址一样对象也就相同,SquareIt函数中的x不是值而是地址,x变那么Main函数的中myInt也跟着变
      

  2.   

    简单说,这个调用,SquareIt(ref myInt),是将 myInt 本身(区别于 myInt 的副本)传递给 SquareIt,SquareIt 操作参数 x 等同于操作 myInt,x*=x,等于 myInt*=myInt,所以调用之后你发现 myInt 的值变了不知道我这么说楼主是不是更糊涂了
      

  3.   

    ref是传递参数的地址,out是返回值
    使用ref前必须对变量赋值,out不用。
    ref是传入值,out是传出值 
     
    ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。例如:class RefExample
    {
      static void Method(ref int i)
      {
      i = 44;
      }
      static void Main()
      {
      int val = 0;
      Method(ref val);
      // val is now 44
      }
    }若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。例如:class OutExample
    {
      static void Method(out int i)
      {
      i = 44;
      }
      static void Main()
      {
      int value;
      Method(out value);
      // value is now 44
      }
    }
      

  4.   

    给你个图看看吧  如果还想更清楚的话就去看看这个帖子
    http://blog.csdn.net/chopper7278/archive/2008/10/02/3010048.aspx
      

  5.   


    using System;
      
      class PassingValByRef  
      {
        public static void SquareIt(ref int x)   
        {   
          x*=x;//等同于x=x*x; 既x=5*5,此时x为25。
          Console.WriteLine("{0}",x); //输出x值为25.
          //注:本函数使用ref关键字,所以本函数返回x的值(x=25)
        }  
      } class Test
     {
        static void Main()
        {
           int myInt=5;  
           Console.WriteLine("{0}", myInt);//myInt值为5,输出5.
           PassingValByRef.SquareIt(ref myInt);//执行PassingValByRef类SquareIt方法
           Console.WriteLine("{0}", myInt);//因上行SquareIt方法使用ref关键字,固ref返回的值传给myInt变量。
           Console.ReadKey();    }
     }
    再举个例子using System; class Test
     {
        static void Swap(ref int x,ref int y)
        {
           int temp = x;//x=1 temp=1
           x = y;//y=2赋给x,x=2
           y = temp;//temp=1赋给y,所以y=1
           //所以,ref返回x=2,y=1,
        }
        static void Main()
        {
           int i =1,j=2;
           Swap(ref i,ref j);
           Console.WriteLine("{0} {1}",i,j);//根据Swap函数最后以行注释 i=2,j=1
        }
     }
      

  6.   


    前两个输出基本懂了,还剩下第三个输出,SquareIt方法不是返回是void的吗,怎么又返回x的值呢,这不是矛盾的吗?如果这样的话,只要一出现 SquareIt(ref myInt);那后面无论什么时候出现myInt,都代表25吗?
    SquareIt(ref myInt);调用了SquareIt这个方法,因此,myInt变成25,这个我还能懂,就是最后一个Console.WriteLine("{0}", myInt);跟SquareIt豪不沾边,都是25....
      

  7.   

    你就想成myInt进入SquareIt方法内跑一圈 myInt自身的值发生了变化 ref的作用是把myInt变化的最后值返回来了以便使用
      

  8.   

    嗯,跑一圈,myInt值发生变化,这个我还能懂,那只要一出现 SquareIt(ref myInt);那这行代码后面无论什么时候出现myInt,都代表跑了一圈吗?因为最后一个Console.WriteLine("{0}", myInt);也是25啊
      

  9.   

    你在 PassingValByRef.SquareIt(ref myInt);下面再写个PassingValByRef.SquareIt(ref myInt);输出看看是什么,最初参数(myInt)是5,返回的是25。第二次执行PassingValByRef.SquareIt(ref myInt);时,参数(myInt)是25,那么返回的是25*25,既625
      

  10.   

    出现 SquareIt(ref myInt);是代表跑一圈 SquareIt方法。参数的不同返回的值也不同
      

  11.   

    out的一个例子 using System; class Test
     {
       static void Divide(int x,int y,out int result,out int remainder)
       {
          result = x/y;//10/3=3
          remainder  = x%y;//10%3=1
       }

        static void Main()
        {
           int res,rem;
           Divide(10,3,out res,out rem);
           Console.WriteLine("{0} {1}",res,rem);
        }
     }看下 int res,rem。变量不需要初始化值既可用于out参数,用ref的话必须给变量初始化值。
      

  12.   


    其实,我就是想了解最后一个输出结果,前两个输出结果,我都能理解,而且,第二个输出结果,要不要ref输出结果都是25,好些网友也是回答的这一点,我主要是想了解最后一点
      

  13.   

    ref描述的是一个引用,out描述的是一个可空引用。就这个区别,ref传递来的参数一定不是null,out传递来的,在函数内一定要初始化一次。
      

  14.   

    加了ref相当于C++的指针了,直接引用了地址,如果它改变了函数的参数也变了