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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 咖喱猫 中级黑马   /  2013-8-12 11:00  /  1133 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 咖喱猫 于 2013-8-12 20:04 编辑

string a;
test1(ref a);
test2(out a);
static void test1(ref string a)

{
    a= "什么情况!";
}
static void test2(out string a)
{
    a= "没情况!";
}
敢问这两个东东有什么区别,各用在什么场合?

4 个回复

倒序浏览
你的代码有错误,原因请往下看:

简单来说
ref 必须由调用方对参数进行初始化赋值,即ref可以把参数及其值传入被调用方法
out 必须在被调用方内部初始化赋值,即out不接受外部传入的值,像它的名字一样,只出不进

当一个参数有明确的值,需要在被调用方法中进行改变时,用ref
当一个参数没有明确的值,需要通过被调用方法得到值时,用out

写了一个例子:
  1. static void Main(string[] args)
  2. {
  3.     Console.WriteLine("请输入一个数字:");
  4.     int s = Convert.ToInt32(Console.ReadLine());//字符检测代码省略
  5.     int jia;
  6.     bool oushu = Jisuan(ref s,out jia);
  7.     if (oushu)
  8.     {
  9.         Console.WriteLine("输入的{0}是偶数,加{1},新值为{2}",s-jia,jia,s);
  10.     }
  11.     else
  12.     {
  13.         Console.WriteLine("输入的{0}不是偶数,减{1},新值为{2}",s+jia,jia,s);
  14.     }
  15.     Console.ReadKey();
  16. }
  17. /// <summary>
  18. /// 被调用方法
  19. /// </summary>
  20. /// <param name="a">在Main()由用户输入的数字,其值明确,需在被调用方法中改变得到新值</param>
  21. /// <param name="b">b参数值不明确,需要在被调用方法中得到新值,</param>
  22. /// <returns>方法的返回值</returns>
  23. static bool Jisuan(ref int a, out int b)
  24. {
  25.     Random r = new Random();
  26.     b = r.Next(1, 100); //out b 必须在Jisuan()内初始化赋值,外部如果有赋值(int jia=100),则外部赋值无效。
  27.                         //      如果缺少此句,程序会报错,无法运行。
  28.     if (a % 2 == 0)     //ref a 必须在调用方(外部方法)初始化赋值,在Jisuan()内可直接使用
  29.     {
  30.         a += b;
  31.         return true;
  32.     }
  33.     else
  34.     {
  35.         a -= b;
  36.         return false;
  37.     }
  38. }
复制代码

点评

哥们,你效率好高~~!不过谢了~!  发表于 2013-8-12 11:10
回复 使用道具 举报
关于你的问题这里有一篇blog有很详细的介绍,值得去学习下:
http://www.cnblogs.com/Tally/archive/2012/05/24/2516455.html

而且在我实际写代码与遇到了ref和out;
比如下面一段代码使用到out:
     if (int.TryParse(str, out i1))      //判断输入是否合法
            {
                switch (i1)
                {
                    case 1:
                        Fighter fighter = new Fighter();                //实例化Fighter
                        Console.WriteLine("给你的战士取个名字吧!");   
                        fighter.Name = Console.ReadLine();              //为Name赋值
                        fighter.HP = 250;                               //为HP赋值
                        fighter.MP = 80;                                //为MP赋值   
                        fighter.AP = 150;                               //为AP赋值
                        Console.WriteLine("{0}: {1} HP {2} MP {3} AP {4}",fighter.Name,fighter.Name, fighter.HP, fighter.MP, fighter.AP);
                        Console.WriteLine();
                        while (boss.HP > 0)             //判断BOSS的HP时候大于0
                        {
                            Console.WriteLine("请选择攻击方式:1、普通攻击 2、技能一 3、技能二 4、怒气技能 ");
                            int i2 = Convert.ToInt32(Console.ReadLine());
                            switch (i2)                             //选择攻击方式
                            {
                                case 1: //普通攻击
                                    Console.WriteLine("普通攻击造成30点伤害\t");
                                    boss.HP = boss.HP - fighter.Fight();
                                    Console.Write("BOSS的HP剩下 {0}\n", boss.HP);
                                    break;
                                case 2: //技能
                                    break;
                                default: break;
                            }
                        }                     
                        break;
               }
       }

使用ref:

     static void Change(ref int left, ref int right)
        {
            int temp;    //定义临时变量
            temp = left;   //将第一个数赋予temp
            left = right;   //第二个数的值赋予第一个数
            right = left;   //将temp中的值赋予第二个数,完成两数交换
        }
        //鸡尾酒排序
        //intArr为要待排序的数组
        static void Cock(int[] intArr)
        {
            int low, up, index;   //定义变量,index为临时变量
            low = 0;     //low为数组的开始索引
            up = intArr.Length - 1;  //up为数组的结束索引
            index = low;
            while (up > low)
            {
                for (int i = low; i < up; i++)   //从低位向高位扫描
                {
                    if (intArr[i] > intArr[i + 1])  //比较前后两数的大小
                    {
                        Change(ref intArr[i], ref intArr[i + 1]); //若前面的数大于后面的数,则交换
                        index = i;    //记录当前索引位置
                    }
                }
                up = index;     //记录最后一次交换的位置
                for (int i = up; i > low; i--)   //从高位向低位扫描
                {
                    if (intArr[i + 1] < intArr[i])  //比较前后两数的大小
                    {
                        Change(ref intArr[i], ref intArr[i + 1]); //若后面的数小于前面的数,则交换
                        index = i;    //记录当前索引位置
                    }
                }
                low = index;
            }
        }

楼主可以自己实践体会下ref和out同异之处。




回复 使用道具 举报 1 0
out 进去后赋值后返回,不赋值前不能使用,ref 不用赋值就能使用,其他的没差别
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马