黑马程序员技术交流社区

标题: 关于ref,out,params的 [打印本页]

作者: 韩温华    时间: 2012-11-22 21:59
标题: 关于ref,out,params的
参数修饰符ref,out ,params的区别
作者: 陈辉    时间: 2012-11-22 22:58
1、如果方法的参数用out来标记,在调用该方法之前,不需要初始化传递给方法的参数,但在方法内部必须初始化该参数
例子:public sealed class Program
          {
                public static void Main()
                {
                       int x;       //x没有初始化
                       GetVal(out x);   //x不需要初始化
                       Console.WriteLine(x);          //结果为10
                }

                private static void GetVal(out int x)
               {
                    v=10;        //必须初始化v
               }
          }

2、如果方法的参数用reft来标记,在调用该方法之前,必须初始化传递给方法的参数
例子:public sealed class Program
          {
                public static void Main()
                {
                        int x=5;       //x已经初始化
                       AddVal (ref x);   //x必须初始化
                       Console.WriteLine(x);          //结果为15
                }

                private static void AddVal(ref int x)
               {
                    v += 10;        
               }
          }

3、params是指向方法传递可变参数,标记了params关键字的参数只能放在方法参数列表的最后,还有,该参数只能标识任意类型的一个一维数组
例子:public sealed class Program
          {
                public static void Main()
                {
                        DisplayTypes(new object(),new Random(),"Jeff",5);
                }

                private static void DisplayTypes (params object[] objects)
               {
                   if(objects!=null)
                   {
                         foreach(object o in objects)
                         {
                               Console.WriteLine(o.GetType());
                          }
                   }      
               }
          }

输出结果:
                System.Object
                System.Random
                System.String
                System.Int32

作者: 王新阳    时间: 2012-11-23 00:16
方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。

方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。属性不是变量,不能作为 out 参数传递。

params 关键字可以指定在参数数目可变处采用参数的方法参数。在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
作者: 韩温华    时间: 2012-11-23 12:49
陈辉 发表于 2012-11-22 22:58
1、如果方法的参数用out来标记,在调用该方法之前,不需要初始化传递给方法的参数,但在方法内部必须初始化 ...

讲解的总是很到位,十分感谢
作者: 陈辉    时间: 2012-11-23 14:17
韩温华 发表于 2012-11-23 12:49
讲解的总是很到位,十分感谢

谢谢给我这么高的评价,让我们一起努力吧
作者: 韩俊    时间: 2012-11-23 23:03
1.ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
2.out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。
例如:
  Class OutExample
{
     static void Method(out int i)
      {
          i=44;
      }
     static void Method(ref int i)
      {
          i=44;
      }
     static void Method(int i)
      {
          i=44;
      }
     static void Main()
      {
         int value;
         Method(value);//在编译的时候都会报错,使用了未赋值的局部变量"value"
         Method(ref value);//在编译的时候都会报错,使用了未赋值的局部变量"value"
         Method(out value);//value=44;编译通过
      }
}
3.params 关键字可以指定在参数数目可变处采用参数的方法参数。例如:

public static void UseParams2(params object[] list)
{
     for (int i = 0; i < list.Length; i++)
      {
            Console.WriteLine(list[i]);
       }
       console.WriteLine();

}
//调用
static void Main()
{
    UseParams2(1,2,3);
}

输出:
1
2
3

在使用params的时候注意的是,在有多于一个参数的情况下,params必须放在最后面,不然会编译不通过的。









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2