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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庞海瑞 中级黑马   /  2013-8-12 19:39  /  1357 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

out和ref有什么区别,在用法上?

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

5 个回复

倒序浏览
1. ref必须先初始化;
2. out则是内部为外部赋值,不需要初始化,如果外部初始化了也没用;
3. ref应用场景内部对外部的值进行改变;
4. out则是内部为外部变量赋值。
回复 使用道具 举报
首先:两者都是按地址传递的,使用后都将改变原来参数的数值。
其次:ref可以把参数的数值传递进函数,ref参数要求在方法外必须赋值,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以方法内必须为out参数赋值。这个就是两个的区别,或者说ref是有进有出,out是只出不进.
out实例:
static void Main(string[] args)
        {
            //请用户输入用户名和密码  写一个方法判断用户是否登录成功  并且返回登录信息
            Console.WriteLine("请输入用户名");
            string strName = Console.ReadLine();
            Console.WriteLine("请输入密码");
            string strPwd = Console.ReadLine();
            string str;
            bool b = IsLogin(strName, strPwd, out str);
            Console.WriteLine("登录结果{0}",b);
            Console.WriteLine("登录信息{0}",str);
            Console.ReadKey();

            //out参数 的作用就是返回多个值   在方法内必须为out参数赋值
        }

        public static bool IsLogin(string name, string pwd,out string msg)//在多余返回值的前面标记out
        {
            bool b = false;
            if(name=="admin"&&pwd=="admin")
            {
                b = true;
                msg = "登录成功";
            }
            else if (name == "admin")
            {
                msg = "密码错误";
            }
            else if (pwd == "admin")
            {
                msg = "用户名错误";
            }
            else
            {
                msg = "未知错我";
            }
            return b;
        }

ref实例:
static void Main(string[] args)
        {

            int n1 = 10;
            int n2 = 20;
            Change(ref n1,ref  n2);//ref 参数 侧重于将值带入一个方法中,再将值从这个方法中带出  ref参数要求在方法外必须赋值
            Console.WriteLine(n1);
            Console.WriteLine(n2);
            Console.ReadKey();
        }


        public static void Change(ref int number1, ref int number2)
        {
            int temp = number1;
            number1 = number2;
            number2 = temp;
        }

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

回复 使用道具 举报
使用Ref型参数时,传入的参数必须先被初始化。而Out则不需要,对Out而言,就必须在方法中对其完成初始化

首先:两者都是按地址传递的,使用后都将改变原来的数值。
其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。即,ref是有进有出,out是只出不进。
Out更适合用在需要Return多个返回值的地方,而Ref则用在需要被调用的方法修改调用者的引用的时候。

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

回复 使用道具 举报
它们的区别是:
1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
注:在C#中,方法的参数传递有四种类型:传值(by value),传址(by reference),输出参数(by output),数组参数(by array)。传值参数无需额外的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out,数组参数需要修饰符params。
以下是有关ref与out的代码:
  1.         static void Main(string[] args)
  2.         {
  3.             int m = 0;
  4.             Console.WriteLine(RefValue(1, ref m).ToString());
  5.             Console.WriteLine(m.ToString());
  6.             int j = 0;
  7.             Console.WriteLine(OutValue(1, out j).ToString());
  8.             Console.WriteLine(j.ToString());
  9.             Console.ReadLine();
  10.         }

  11.         public static int RefValue(int i, ref int j)
  12.         {
  13.             int k = j;
  14.             j = 10;
  15.             return i + k;
  16.         }


  17.         public static int OutValue(int i, out int j)
  18.         {
  19.             j = 10;
  20.             return i + j;
  21.         }
复制代码
回复 使用道具 举报
  1. using System;
  2. namespace Que
  3. {
  4.     class Program
  5.         {
  6.             static void Main(string[] args)
  7.                 {
  8.                     int i1 = 2;
  9.                         int i2 = 3;
  10.                         ChangeNum(ref i1,ref i2);
  11.                         Console.WriteLine("i1 = {0},i2 = {1}",i1,i2);
  12.                         Console.ReadKey();
  13.                 }
  14.                
  15.                 //交换两个变量
  16.                 static void ChangeNum(ref int i1,ref int i2)
  17.                 {
  18.                     i1 = i1 + i2;
  19.                         i2 = i1 - i2;
  20.                         i1 = i1 - i2;
  21.                 }
  22.         }
  23. }1.ref是引用传递
复制代码
输出i1 = 3,i2 = 2

2.out 是从方法中给调用方法前后的变量赋一个值
  1. using System;
  2. namespace Out
  3. {
  4.     class Program
  5.         {
  6.             static void Main(string[] args)
  7.                 {
  8.                     int i1;
  9.                         int i2 = 2;
  10.                         Outusing(i2,out i1);
  11.                         Console.WriteLine("i1为out出来的,值是{0}",i1);
  12.                         Console.ReadKey();
  13.                   
  14.                 }
  15.                
  16.                 //交换两个变量
  17.                 static void Outusing(int i,out int iout)
  18.                 {
  19.                     iout = i*5;

  20.                 }
  21.         }
  22. }

  23. //结果是:i1为out出来的,值是10
复制代码

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

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