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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© y494890511 高级黑马   /  2013-11-7 13:32  /  2128 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 y494890511 于 2013-11-12 08:33 编辑

在方法中值传递和引用传递 out和ref

10 个回复

倒序浏览
使用ref引用传递变量一定要提前赋值。

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
这个视频里讲的很清楚的
out ref 区别就先赋值和后赋值的区别,其它暂时不必深究,

评分

参与人数 1技术分 +1 收起 理由
陈福军 + 1

查看全部评分

回复 使用道具 举报
out参数在传入方法前只需要定义,不需要且不能赋值。在方法结束前必须赋值。
ref参数在传入方法前需要且必须赋值。

out参数主要为了实现方法的多个返回值
ref参数是在out参数上做的一种升级,这样可以将一个普通参数和一个out参数合并到一起。

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
ref是指向 引用(地址),out是指向内存(值)

评分

参与人数 1技术分 +1 收起 理由
陈福军 + 1

查看全部评分

回复 使用道具 举报
上面几位已经说得很清楚了。记不住可以这么记忆:
两者都是引用传递。ref主要是为了方法内部用的,所以叫传入,而且使用前必须赋值。out主要是为了解决方法返回多个值问题,所以叫传出,而且返回前必须已经赋过值。这样一想,out的那个变量在方法外部就没必要赋初值了,只需定义。

评分

参与人数 1技术分 +1 收起 理由
陈福军 + 1

查看全部评分

回复 使用道具 举报
一.ref和out的共同点

1.ref和out关键字都是指出一个值类型变量或是引用类型变量应该以引用方式传递。

2.尽管 ref 和 out 在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法,例如:从编译角度看下面两个方法是相同的,所以不能编译通过。

public void SampleMethod(ref int i) { }     
  public void SampleMethod(out int i) { }
3.二者都可以使方法返回多个值

二.ref和out的不同点

1.out 指定一个输出参数,被调用的方法可向其赋值,所以在参数传递时可以不初始化,但是ref在传递前必须被初始化

2.out 用于传出值,ref是双向的,即可以传入也可以传出

三.实例

  class Program
     {
         static void Main(string[] args)
         {
             int result;


            Console.WriteLine("请输入一个字符串,查看是否能转化成整数类型");


            if (myTryParse(Console.ReadLine(), out result))
             {
                 Console.WriteLine("转化成功,结果是{0}", result);
             }
             else
             {
                 Console.WriteLine("转化失败,您的输入不能转化成整数类型");
             }
             Console.ReadKey();
         }


        /// <summary>
         /// 试着转化字符串为int类型,如果转化成功返回true,
         /// </summary>
         /// <param name="str">要转化的字符串</param>
         /// <param name="result">参数返回转换后的int</param>
         /// <returns>是否转化成功,成功:true  失败:false</returns>
         public static bool myTryParse(string str, out int result)
         {
             result = 0;
             try
             {
                 result = Convert.ToInt32(str);
                 return true;
             }
             catch (Exception ex)
             {
                 return false;
             }
         }


        public static int totol(int[] shu, out int maxNum, out int minNum)
         {
             int totol = 0;
             maxNum =shu[0];
             minNum =shu[0];
             for (int i = 0; i < shu.Length; i++)
             {
                 totol += shu[i];


                if (maxNum < shu[i])
                 {
                     maxNum = shu[i];
                 }


                if (minNum > shu[i])
                 {
                     minNum = shu[i];
                 }
             }
             return totol;
         }
     }




评分

参与人数 1技术分 +1 收起 理由
陈福军 + 1

查看全部评分

回复 使用道具 举报
方法只能返回一个值,如果想要方法返回多个值怎么办?这就要用到参数反值了。方法中的out参数和ref参数。
        在方法的参数前加out,那么在调用该方法的时候所传的参数也要加out,out修饰的参数不是用来向方法传入值得,
        而是用来向方法外传出值的。如果参数是以out形式传入的,那么在传入前可以不赋初值,在方法中对于由out修饰的参数,
        必须先赋值,才能使用。例如int.TryParse(string s,out int result)。out注重传出值  ref是用于双向传值类似于
        c语言中的指针,不加ref修饰的传参是将参数复制一份传过去,加ref后就相当于将参数的地址传过去了,
        C#中用ref屏蔽了指针。在传参数的过程中,如果参数有out或ref修饰的话,那么改变方法中的参数变量的值,调用者
        方法中变量的值也会相应改变。
        ->在即时窗口输入&(变量名)可以查看变量在内存中的即时地址。

评分

参与人数 1技术分 +1 收起 理由
陈福军 + 1

查看全部评分

回复 使用道具 举报
其实吧ref参数和out参数并没有太大的联系。
out侧重于一个方法返回多个返回值
ref侧重于将参数带入到方法中进行改变然后再带出来
具体用法参照视频

评分

参与人数 1技术分 +1 收起 理由
陈福军 + 1

查看全部评分

回复 使用道具 举报
ref:用来声明引用参数。实现数据的传递。
  out:用来声明输出型参数。输出型参数不需要对实参进行初始化。

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
out侧重于输出,ref侧重于修改。

评分

参与人数 1技术分 +1 收起 理由
陈福军 + 1

查看全部评分

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