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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邓江红 中级黑马   /  2014-4-1 14:00  /  1074 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

参数中使用out和ref的区别?

6 个回复

倒序浏览
OUT 注重传出,使用有OUT参数的方法时,要传的参数在方法外可以不用赋初值,但方法内必须先给参数赋值才可以使用
REF 注重传入,使用有REF参数的方法时,要传的参数在方法外必须先赋初值,方法内可以对它赋值也可以不赋值,它能获取到在方法外赋过的值,OUT参数虽然也能将原来的值传入,但在方法内赋值前不能使用,所以在给OUT参数在方法外赋值意义不大
回复 使用道具 举报
  1.   static void Main(string[] args)
  2.         {
  3.             int number;// = 10; 如果没有out,必须给number赋值
  4.             int result = Test(out number);
  5.             Console.WriteLine("number={0},result={1}", number, result);
  6.             Console.ReadKey();
  7.         }
  8.         
  9.    
  10.         static int Test(out int a)//由out修饰的参数是往外传出值的,方法的参数中有out,那么调用此方法时,也需要在参数前面加out。
  11.         {                         //通过out将a和number联系起来,就是a给number赋值。这就是通过参数返值。
  12.             a = 20;//由out修饰的参数,必须先赋值。
  13.             return 200;
  14.         }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
  1. static void Main(string[] args)
  2.         {
  3.             int[] nums = { 1,2,3,4,5,6,};
  4.             int max1, min1, sum1;
  5.             sum1 = compute(nums,out max1,out min1);
  6.             Console.WriteLine("数组的和为{0},最大值{1},最小值{2}",sum1,max1,min1);
  7.             Console.ReadKey();


  8.         }

  9.         /// <summary>
  10.         /// out用于传出值,ref是双向的,既可以传入值,也可以传出值。
  11.         /// </summary>
  12.         /// <param name="number">传入的数组</param>
  13.         /// <param name="max">最大值</param>
  14.         /// <param name="min">最小值</param>
  15.         /// <returns>和</returns>
  16.         static int compute(int[] number,out int max2,out int min2)
  17.         {
  18.             int sum2 = 0;
  19.             max2 = number[0];
  20.             min2 = number[0];
  21.             for (int i = 0; i < number.Length; i++)
  22.             {
  23.                 sum2 += number[i];
  24.                 if (number[i] > max2)
  25.                 {
  26.                     max2 = number[i];
  27.                 }
  28.                 if (number[i] < min2)
  29.                 {
  30.                     min2 = number[i];
  31.                 }
  32.             }
  33.             return sum2;
  34.         }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
上面代码都是我看视频学习的时候,跟着苏坤老师做的  
希望能帮到你。
回复 使用道具 举报
  private void btnReference_Click(object sender, EventArgs e)
        {
            int intRef = 1;  //使用ref型参数时,局部变量ref必须先被初始化
            int intOut=1;   //可以不用初始化   
            int showRef = RefValue(10,ref intRef);
            int showOut = OutValue(10, out intOut);
            MessageBox.Show("intRef="+intRef.ToString()+"showRef="+showRef.ToString()); //intRef=1 showRef=11
            MessageBox.Show("intOut=" + intOut.ToString() + "showOut=" + showOut.ToString()); //intOut=10 showOut=20
           
        }
     
        public static int RefValue(int i, ref int j)
        {
            return i + j;
        }
        public static int OutValue(int i, out int j)
        {
            //对out而言,必须在方法中对其完成初始化,同时这样也会把传入的out变量重新赋值
            //这也就是我们看到比较多一句话 ref是有进有出 out是只进不出
            j = 10;
            return i + j;
        }

评分

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

查看全部评分

回复 使用道具 举报
ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别。总结起来,他们有如下语法区别:

1、ref传进去的参数必须在调用前初始化,out不必,即:
int i;
SomeMethod( ref i );//语法错误
SomeMethod( out i );//通过
2、ref传进去的参数在函数内部可以直接使用,而out不可:
public void SomeMethod(ref int i)
{
   int j=i;//通过
   //...
}
public void SomeMethod(out int i)
{
   int j=i;//语法错误
}
3、ref传进去的参数在函数内部可以不被修改,但out必须在离开函数体前进行赋值。

总结:
应该说,系统对ref的限制是更少一些的。out虽然不要求在调用前一定要初始化,但是其值在函数内部是不可见的,也就是不能使用通过out传进来的值,并且一定要赋一个值。也就是说函数承担初始化这个变量的责任。  

评分

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

查看全部评分

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