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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王赟 中级黑马   /  2013-4-17 15:45  /  1521 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王赟 于 2013-4-19 14:03 编辑

ref和out的区别 该如何使用?
一直没有搞明白

评分

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

查看全部评分

4 个回复

倒序浏览
  1. static void Main(string[] args)
  2.         {
  3.             
  4.             //声明两个变量
  5.             int numOne = 10;
  6.             int numTwo = 20;
  7.             //声明平均值和总和,并调用方法
  8.             int avg;
  9.             int sum = GetSumAndAvg(ref numOne, ref  numTwo, out avg);
  10.             Console.WriteLine("{0},{1},{2},{3}", sum, avg, numOne, numTwo);
  11.             Console.ReadKey();
  12.         }
  13.         /// <summary>
  14.         /// ref侧重于把变量带进方法里,然后在方法里重新赋值后,再带出来,out则是可以多返回一个值
  15.         /// </summary>
  16.         /// <param name="numOne"></param>
  17.         /// <param name="numTwo"></param>
  18.         /// <param name="avg"></param>
  19.         /// <returns></returns>
  20.         public static int GetSumAndAvg(ref int numOne, ref  int numTwo, out int avg)//如果这里不用ref交换变量不会成功
  21.         {
  22.             //交换变量,并计算总和还有平均值
  23.             int numThree = numOne;
  24.             numOne = numTwo;
  25.             numTwo = numThree;
  26.             int sum = numOne + numTwo;
  27.             avg = sum / 2;
  28.             return sum;//返回总和,用了out能多返回一个平均值avg
  29.         }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
out 主要用于传出值,ref 即可传入值也可传出值,使用lout和out 传值的参数前都要加上out或者ref
使用out修饰的参数在使用前必须对其进行赋值.
        static void Main(string[] args)
        {
            int number;
            int result=Test(out number);
            Console.WriteLine(result);
            Console.ReadKey();
        }
        static int Test(out int a)
        {
            a = 600;
            int b = a;
            return b;
        }

评分

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

查看全部评分

回复 使用道具 举报
如果参数是以out形式传入的,可以不赋初值,方法中用out修饰的参数,在使用前必须赋值即out主要用于传出值。而ref指的是引用既可以传入也可以传出值。

评分

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

查看全部评分

回复 使用道具 举报
class Program
    {
        static void Main(string[] args)
        {
            int number=0;
            int result = Test(out number);
            Console.WriteLine("number={0}  result={1}", number, result);
            Console.ReadKey();
        }
        static int Test(out int a)              

       {
            a = 20;//如果有a=a+1,则必须放在a=20之后才能使用
            return a;
        }
    }

使用out是把test方法中的a值赋给number,同时使用out时 双方a和number前都要加out,

而 out的作用就是往方法外的变量赋值。(赋值之前必须在test方法中必须先给a赋值后才能同时a在方法中才能使用)

然后ref的用法:

ref既可以往外返值 也可以往里传值看例子:

class Program
    {
        static void Main(string[] args)
        {
            int number=0;
            int result = Test(ref number);
            Console.WriteLine("number={0}  result={1}", number, result);
            Console.ReadKey();
        }
        static int Test(ref int a)      //把a值赋给number        

       {
                  a = 20;           

         
               }
    }

同时 如果在test()中 在 a=20之前加入b=a 那么number就可以把值赋给a.

总结:out和ref共同点--变量前有out或ref的只要改变方法中变量的值,那么调用者方法中变量值也发生改变!

           不同点----ref也可以传入,其实ref相当于把调用者变量的地址赋给了方法中的变量,我个人理解为把自己的属性赋给了方法中的变量,产生的效果,就是改变两者任何一方的变量值另一方也会改变。


  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马